2013-04-24 31 views
11

Nhìn vào các tài liệu intrinsics AVX2 có được tập hợp hướng dẫn tải như VPGATHERDD:AVX2 thu thập hướng dẫn - tải địa chỉ tính

__m128i _mm_i32gather_epi32 (int const * base, __m128i index, const int scale); 

gì không phải là rõ ràng với tôi từ các tài liệu được xem địa chỉ tải tính toán là một yếu tố địa chỉ hoặc một byte địa chỉ, tức là địa chỉ tải cho các phần tử i:

load_addr = base + index[i] * scale;    // (1) element addressing ? 

hay:

load_addr = (char *)base + index[i] * scale;  // (2) byte addressing ? 

Từ Intel docs nó trông giống như nó có thể được (2), nhưng điều này không có ý nghĩa nhiều cho rằng kích thước phần tử nhỏ nhất cho tải tập trung là 32 bit - tại sao bạn muốn tải từ địa chỉ lệch (I E sử dụng quy mô < 4)?

Trả lời

8

Hướng dẫn thu thập không có bất kỳ yêu cầu căn chỉnh nào. Vì vậy, nó sẽ là quá hạn chế không cho phép địa chỉ byte.

Lý do khác là nhất quán. Với SIB giải quyết chúng tôi rõ ràng là có byte địa chỉ:

MOV eax, [rcx + rdx * 2] 

Kể từ VPGATHERDD chỉ là một biến thể vectorized của MOV hướng dẫn này, chúng ta không nên mong đợi bất cứ điều gì khác nhau với VSIB giải quyết:

VPGATHERDD ymm0, [rcx + ymm2 * 2], ymm3 

Đối với thực sử dụng cuộc sống cho byte giải quyết, chúng tôi có thể có hình ảnh màu 24 bit trong đó mỗi pixel được căn chỉnh 3 byte. Chúng tôi có thể tải 8 pixel với chỉ lệnh VPGATHERDD duy nhất nhưng chỉ khi trường "tỷ lệ" trong VSIB là "1" và VPGATHERDD sử dụng địa chỉ byte.

+1

OK - cảm ơn - Tôi đoán điều đó có ý nghĩa sau đó và nó phù hợp với tài liệu. Bạn thực hiện một điểm tốt về tải ví dụ: Giá trị pixel 3 byte. –

4

Đánh giá theo mô tả trong Intel AVX programming reference document available here, có vẻ như hướng dẫn thu thập sử dụng địa chỉ byte. Cụ thể, xem trích dẫn sau đây mô tả của VPGATHERDD hướng dẫn (trên trang 389):

DISP: optional 1, 2, 4 byte displacement; 
DATA_ADDR = BASE_ADDR + (SignExtend(VINDEX[i+31:i])*SCALE + DISP; 

Vì bạn có thể sử dụng 1/2/4 byte chuyển vị, tôi sẽ giả định rằng địa chỉ bộ nhớ tổng thể là một địa chỉ byte. Mặc dù nó có thể không phải là một ứng dụng phổ biến, nhưng có thể có trường hợp bạn muốn đọc một giá trị 32 hoặc 64 bit từ một địa chỉ không chính xác. Đó là một trong những điều linh hoạt hơn về kiến ​​trúc x86 khi so sánh với một cái gì đó như ARM; bạn có thể linh hoạt để thực hiện các truy cập không đúng giá trị nếu bạn muốn, thay vì kích hoạt một ngoại lệ CPU như một số khác làm.

+1

Chỉ cần FYI, ARM hỗ trợ truy cập bộ nhớ không được điều chỉnh kể từ ARMv6 –

+0

Cảm ơn bạn đã sửa. Kinh nghiệm ARM của tôi giờ đã trở nên hơi ngày. –

1

tại sao bạn muốn tải từ địa chỉ không được căn lề (tức là sử dụng thang đo < 4)?

Tải không được chỉ định không phải là trường hợp sử dụng duy nhất cho quy mô < kích thước phần tử. Bạn có thể chỉ có các chỉ số được bù trừ byte trước khi chia tỷ lệ. Hoặc xem xét vector hóa một vòng lặp trên một mảng con trỏ tới cấu trúc: bạn có thể thu thập với một "địa chỉ" cơ sở bằng không hoặc một số nguyên nhỏ được bù đắp vào cấu trúc.

Hỗ trợ trường hợp sử dụng này là một trong những lý do để Intel thiết kế lệnh asm để hỗ trợ điều này, vì tập hợp được cho là giúp trình biên dịch tự động mã hóa nhiều mã hơn. Nó cũng phù hợp một cách tự nhiên cho byte VSIB rất gần với SIB trong mã hóa mã máy, nhưng chúng có thể dễ dàng có hệ số thang đo trước để cung cấp cho bạn lựa chọn tỷ lệ = 4,8,16,32 (hoặc 8 , 16,32,64 cho tập hợp qword) với trường tỷ lệ 2 bit.

Các yếu tố tỷ lệ lớn hơn kích thước phần tử không rõ ràng là hữu ích trong nhiều trường hợp, và dễ dàng mô phỏng bằng một lệnh dịch chuyển trái trước khi thu thập. Nhưng nó sẽ không thể làm việc xung quanh một yếu tố quy mô nướng, do đó, cho phép chỉ số unscaled rõ ràng là sự lựa chọn thiết kế linh hoạt hơn.


Các trường hợp sử dụng khác: thu thập các phần tử 16 bit. Sử dụng một thu thập 32 bit và mặt nạ ra khỏi nửa trên của mỗi phần tử sau khi thu thập. (Hoặc chỉ để nó giữ rác). Điều đó sẽ dẫn đến tải không đúng nếu bất kỳ chỉ mục nào của bạn là lẻ (với hệ số tỷ lệ là 2), vì vậy nó có thể chậm nếu chúng vượt qua ranh giới 4k (không giống như thu thập 16 bit thực). Bạn cũng có thể tưởng tượng sử dụng một tập hợp như là một phần của một chức năng giải nén, nơi sau khi một số giải mã bạn có một vectơ offset vào một bộ đệm, và bạn muốn tùy ý 4-byte hoặc 8-byte cửa sổ dữ liệu.

Các vấn đề liên quan