2015-10-07 16 views
5

Tôi có câu hỏi về tùy chọn căn chỉnh mới trong OpenMP. Đây là ngữ cảnh sử dụng nó với #pragma omp simd aligned(a:n)Tùy chọn căn chỉnh OpenMP 4?

Giả sử tôi có một dãy số nguyên mà tôi đã cấp phát bằng cách sử dụng posix_memalign vì vậy tôi biết rằng mảng bắt đầu cho phép nói một ranh giới 32 byte. Bây giờ cho phép nói rằng tôi muốn vuông mỗi giá trị trong mảng đó. Tôi có thể nói ...

int* array = { some array of length len aligned to 32 bytes }; 
#pragma omp simd aligned(array:32) 
for(int i = 0; i < len; i++) 
    array[i] *= array[i]; 

Đây có phải là giả định an toàn không? Hoặc không liên kết cũng ngụ ý rằng loại dữ liệu kích thước tôi đang sử dụng (int) trong mảng là bội số của 32 byte? Kiểu giống như cách thuộc tính ((căn chỉnh (32)) trong gcc sẽ tạo loại chiều rộng tối thiểu 32 byte.

+0

32 byte -> 32 bit –

+0

Có điều này là chính xác những gì phù hợp với 32 byte có nghĩa là. – NoseKnowsAll

+1

OP có nghĩa là 32 byte, có lẽ vì đó là độ dài của SIMD 256 bit, ví dụ: AVX-2. – Jeff

Trả lời

3

Để đảm bảo chúng ta hiểu nhau, giả sử bạn array thực sự là liên kết 256 bit (tương đương với liên kết 32 byte của bạn)

Sau đó, có, #pragma omp simd aligned(array:32) của bạn là an toàn, không phụ thuộc vào độ dài của mảng hoặc kích thước của loại mảng. Điều duy nhất quan trọng là địa chỉ được chỉ ra bởi "con trỏ" được sử dụng để tham chiếu mảng.


EDIT: Tôi nhận ra rằng câu trả lời của tôi, mặc dù chính xác, hơi khô vì nó chỉ là tôi trả lời, nhưng không có bất kỳ sự hỗ trợ "chính thức" nào cho nó. Vì vậy, đây là một số trích đoạn của tiêu chuẩn để duy trì câu trả lời của tôi:

Từ OpenMP 4.0 standard §2.8.1:

[C/C++: Mệnh đề liên kết tuyên bố rằng đối tượng mà mỗi điểm mục danh sách là liên kết với số byte được biểu thị trong thông số tùy chọn của mệnh đề được liên kết.]

Tham số tùy chọn của mệnh đề căn chỉnh, căn chỉnh, phải là biểu thức số nguyên dương không đổi . Nếu không có thông số tùy chọn là được chỉ định, các căn chỉnh mặc định được triển khai cho SIMD hướng dẫn trên nền tảng đích được giả định.

[...]

[C: Các loại mặt hàng danh sách xuất hiện trong mệnh đề liên kết phải mảng hoặc con trỏ.]

[C++: Các loại mặt hàng danh sách xuất hiện trong mệnh đề liên kết phải là mảng, con trỏ, tham chiếu đến mảng hoặc tham chiếu đến con trỏ.]

Như bạn thấy, không có giả định về loại dữ liệu được trỏ hoặc tham chiếu bởi biến được sử dụng bên trong mệnh đề aligned. Giả định duy nhất là địa chỉ của phân đoạn bộ nhớ được liên kết byte với tham số tùy chọn hoặc một số "sắp xếp mặc định được triển khai" (BTW mạnh mẽ khuyến khích tôi luôn cung cấp thông số tùy chọn này vì tôi không biết điều này giá trị mặc định thực hiện được xác định có thể là, và nhiều hơn nữa cho điểm, cho dù tôi sẽ chắc chắn rằng mảng của tôi thực sự được liên kết theo cách này).

3

aligned(ptr:n) thông báo cho trình biên dịch rằng mảng phía sau ptr bắt đầu từ địa chỉ được liên kết với n byte. Điều này giúp trình biên dịch quyết định cách tối ưu hóa vectơ vòng lặp. Vì nhiều đơn vị vector yêu cầu tải vector và lưu trữ được căn chỉnh, nếu trình biên dịch không thể suy ra sự liên kết của dữ liệu tại thời gian biên dịch, nó phải tạo mã thời gian chạy kiểm tra căn chỉnh và cuối cùng thực hiện các phần không được ký hiệu của vòng lặp (cả hai bắt đầu và ở cuối không gian lặp) sử dụng hướng dẫn vô hướng. Những kiểm tra này tốn thời gian, đặc biệt là với độ dài mảng nhỏ hơn. Nếu sự liên kết thích hợp được biết ở thời gian biên dịch, trình biên dịch có thể trực tiếp phát ra các hoạt động vô hướng cần thiết. Với AVX-512 (Intel Xeon Phi) các tải trọng và cửa hàng không được ký hiệu được thực hiện bằng cách sử dụng mặt nạ và cung cấp sự liên kết chính xác cho phép trình biên dịch phát trực tiếp các lệnh được che giấu khi cần thay vì tính toán các mặt nạ tại thời gian chạy.

+0

Các tải và cửa hàng không được gán không phải là vấn đề lớn đối với lõi x86 kể từ Nehalem (2008). –

+0

Chúng không miễn là chúng không gây ra sự chia tách dòng bộ nhớ cache, mặc dù chúng rẻ hơn nhiều so với các kiến ​​trúc vi x86 trước đó. Dù sao, nhận xét của tôi về tạo mã là chung - trình biên dịch được tự do bỏ qua mệnh đề liên kết được đưa ra cho một kiến ​​trúc cụ thể. –

+0

Biến những vấn đề liên kết nhiều hơn tôi mặc dù kể từ Nehalem. Bạn có thể đọc về nó trong câu trả lời của tôi ở đây (với một số sửa đổi) http://stackoverflow.com/questions/33504003/how-to-write-c-code-that-the-compiler-can-efficiently-compile-to- sse-or-avx/33518813 # 33518813 –

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