Để đả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).
32 byte -> 32 bit –
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
OP có nghĩa là 32 byte, có lẽ vì đó là độ dài của SIMD 256 bit, ví dụ: AVX-2. – Jeff