के कारण एसएसई इंट्रिनिक्स के साथ काम करते समय सेगमेंटेशन गलती मैं पहली बार एसएसई इंट्रिनिक्स के साथ काम कर रहा हूं और मुझे 16byte मेमोरी संरेखण सुनिश्चित करने के बाद भी सेगमेंटेशन गलती का सामना करना पड़ रहा है।गलत स्मृति संरेखण
float *V = (float*) memalign(16,dx*sizeof(float));
जब मैं यह करने के लिए प्रयास करें::
How to allocate 16byte memory aligned data
यह कैसे मैं अपने सरणी घोषणा की है है: इस पोस्ट में मेरी पहले सवाल का एक विस्तार है
__m128 v_i = _mm_load_ps(&V[i]); //It works
लेकिन जब मैं ऐसा करता हूं:
__m128 u1 = _mm_load_ps(&V[(i-1)]); //There is a segmentation fault
लेकिन अगर मैं कार्य करें:
__m128 u1 = _mm_loadu_ps(&V[(i-1)]); //It works again
हालांकि मैं _mm_loadu_ps
का उपयोग कर को खत्म करने और यह केवल _mm_load_ps
का उपयोग कर काम करना चाहते हैं करना चाहते हैं।
मैं इंटेल आईसीसी कंपाइलर के साथ काम कर रहा हूं।
मैं इस समस्या को कैसे हल करूं?
अद्यतन:
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 संस्करण:
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);
}
वहाँ केवल _mm_load_ps()
का उपयोग कर ऐसा करने का एक अधिक कुशल तरीका है
निम्नलिखित कोड में दोनों के संचालन का उपयोग कर?
आपके आर्किटेक्चर पर 'sizeof (float)' क्या है? – ecatmur
@ecatmur: मैं 64 बिट मशीन पर काम कर रहा हूं। – PGOnTheGo
जो प्रश्न का उत्तर नहीं देता है; 64-बिट एबीआई के बहुत सारे हैं। – ecatmur