Tôi đang làm việc với SSE nội tại lần đầu tiên và tôi gặp phải lỗi phân đoạn ngay cả sau khi đảm bảo liên kết bộ nhớ 16byte. Bài đăng này là một phần mở rộng cho câu hỏi trước đây của tôi:Lỗi phân đoạn khi làm việc với SSE nội tại do liên kết bộ nhớ không chính xác
How to allocate 16byte memory aligned data
Đây là cách tôi đã tuyên bố mảng của tôi:
float *V = (float*) memalign(16,dx*sizeof(float));
Khi tôi cố gắng để làm điều này:
__m128 v_i = _mm_load_ps(&V[i]); //It works
Nhưng khi tôi làm điều này:
__m128 u1 = _mm_load_ps(&V[(i-1)]); //There is a segmentation fault
Nhưng nếu tôi làm:
__m128 u1 = _mm_loadu_ps(&V[(i-1)]); //It works again
Tuy nhiên tôi muốn loại bỏ sử dụng _mm_loadu_ps
và muốn làm cho nó hoạt sử dụng _mm_load_ps
chỉ.
Tôi đang làm việc với trình biên dịch icc của Intel.
Làm cách nào để giải quyết vấn đề này?
UPDATE:
sử dụng cả hai hoạt động trong đoạn mã sau:
void FDTD_base (float *V, float *U, int dx, float c0, float c1, float c2, float c3, float c4)
{
int i, j, k;
for (i = 4; i < dx-4; i++)
{
U[i] = (c0 * (V[i]) //center
+ c1 * (V[(i-1)] + V[(i+1)])
+ c2 * (V[(i-2)] + V[(i+2)])
+ c3 * (V[(i-3)] + V[(i+3)])
+ c4 * (V[(i-4)] + V[(i+4)]));
}
}
SSE phiên bản:
for (i=4; i < dx-4; i+=4)
{
v_i = _mm_load_ps(&V[i]);
__m128 center = _mm_mul_ps(v_i,c0_i);
__m128 u1 = _mm_loadu_ps(&V[(i-1)]);
u2 = _mm_loadu_ps(&V[(i+1)]);
u3 = _mm_loadu_ps(&V[(i-2)]);
u4 = _mm_loadu_ps(&V[(i+2)]);
u5 = _mm_loadu_ps(&V[(i-3)]);
u6 = _mm_loadu_ps(&V[(i+3)]);
u7 = _mm_load_ps(&V[(i-4)]);
u8 = _mm_load_ps(&V[(i+4)]);
__m128 tmp1 = _mm_add_ps(u1,u2);
__m128 tmp2 = _mm_add_ps(u3,u4);
__m128 tmp3 = _mm_add_ps(u5,u6);
__m128 tmp4 = _mm_add_ps(u7,u8);
__m128 tmp5 = _mm_mul_ps(tmp1,c1_i);
__m128 tmp6 = _mm_mul_ps(tmp2,c2_i);
__m128 tmp7 = _mm_mul_ps(tmp3,c3_i);
__m128 tmp8 = _mm_mul_ps(tmp4,c4_i);
__m128 tmp9 = _mm_add_ps(tmp5,tmp6);
__m128 tmp10 = _mm_add_ps(tmp7,tmp8);
__m128 tmp11 = _mm_add_ps(tmp9,tmp10);
__m128 tmp12 = _mm_add_ps(center,tmp11);
_mm_store_ps(&U[i], tmp12);
}
Có cách nào hiệu quả hơn để làm điều này chỉ sử dụng _mm_load_ps()
?
'sizeof (float)' trên kiến trúc của bạn là gì? – ecatmur
@ecatmur: Tôi đang làm việc trên máy 64 bit. – PGOnTheGo
không trả lời câu hỏi; có rất nhiều ABI 64 bit khác nhau. – ecatmur