Tôi đang cố gắng thực hiện vector hóa SSE trên một đoạn mã mà tôi cần mảng 1D của mình để được liên kết bộ nhớ 16 byte. Tuy nhiên, tôi đã thử một số cách để phân bổ 16byte bộ nhớ liên kết dữ liệu nhưng nó kết thúc lên được 4byte bộ nhớ liên kết.Cách phân bổ dữ liệu liên kết bộ nhớ 16byte
Tôi phải làm việc với trình biên dịch icc của Intel. Đây là một mẫu mã Tôi đang thử nghiệm với:
#include <stdio.h>
#include <stdlib.h>
void error(char *str)
{
printf("Error:%s\n",str);
exit(-1);
}
int main()
{
int i;
//float *A=NULL;
float *A = (float*) memalign(16,20*sizeof(float));
//align
// if (posix_memalign((void **)&A, 16, 20*sizeof(void*)) != 0)
// error("Cannot align");
for(i = 0; i < 20; i++)
printf("&A[%d] = %p\n",i,&A[i]);
free(A);
return 0;
}
Đây là sản phẩm tôi nhận được:
&A[0] = 0x11fe010
&A[1] = 0x11fe014
&A[2] = 0x11fe018
&A[3] = 0x11fe01c
&A[4] = 0x11fe020
&A[5] = 0x11fe024
&A[6] = 0x11fe028
&A[7] = 0x11fe02c
&A[8] = 0x11fe030
&A[9] = 0x11fe034
&A[10] = 0x11fe038
&A[11] = 0x11fe03c
&A[12] = 0x11fe040
&A[13] = 0x11fe044
&A[14] = 0x11fe048
&A[15] = 0x11fe04c
&A[16] = 0x11fe050
&A[17] = 0x11fe054
&A[18] = 0x11fe058
&A[19] = 0x11fe05c
Nó được 4byte thẳng hàng mọi lúc, tôi đã sử dụng cả hai memalign, posix memalign. Vì tôi đang làm việc trên Linux, tôi không thể sử dụng _mm_malloc, tôi cũng không thể sử dụng _aligned_malloc. Tôi nhận được một lỗi tham nhũng bộ nhớ khi tôi cố gắng sử dụng _aligned_attribute (đó là thích hợp cho gcc một mình tôi nghĩ).
Bất kỳ ai cũng có thể giúp tôi tạo chính xác dữ liệu liên kết bộ nhớ 16byte cho icc trên nền tảng Linux.
Làm thế nào để bạn biết nó là 4 byte phù hợp, đơn giản chỉ vì printf là chỉ outputting 4 byte tại một thời điểm? Chỉ vì bạn đang sử dụng thói quen memalign, bạn đang đặt nó vào một kiểu float. Khi bạn in bằng printf, nó biết cách xử lý thông qua kiểu nguyên thủy (float). – trumpetlicks
Tại sao bạn không thể sử dụng "_mm_malloc" trên Linux? –