두 개의 배열에 'fa'와 'tempxyz'가 있습니다. 하나를 다른 것으로부터 빼고 다른 배열에 저장해야합니다. 스트리밍 상점을 사용하고 있습니다. 따라서 액세스를 정렬해야합니다. 이 두 배열과 세 번째 배열을 정렬했습니다. 나는 여전히 seg을 얻고있다. 결점. 스트리밍 저장소의 경우 배열은 64 바이트로 정렬되어야합니다. 즉, 배열의 모든 요소가 64 바이트 떨어져 있어야 모든 요소의 주소가 64의 배수가된다는 의미입니까? 나는 아래에 나의 코드 스 니펫을 주었다. 친절하게 도와주세요.데이터 정렬 문제로 인한 세그먼트 오류 MIC
main()
{
double *force = (double *) _mm_malloc ((nd * np)* sizeof (double),64);
// np can be any number (np=1000, 2000, etc.)
// nd = 3
__declspec(align(64)) double array[np*nd];
compute (force, array);
}
void compute (double *f double array[np*nd])
{
__declspec(align(64)) double fa[8], tempxyz[8];
for(k=0;k<np;k++)
{
__assume_aligned(f,64);
__assume((k*nd) % 8 == 0);
for (i = 0; i < nd; i++)
{
f[i+k*nd] = 0.0;
}
// Doing some computation on array and storing it in fa.
fa[0] = array[k*nd+0];
fa[1] = array[k*nd+1];
fa[2] = array[k*nd+2];
__m512d y1, y2, y3;
__assume_aligned(&fa,64);
__assume_aligned(&tempxyz,64);
// Want to load 3 elements at a time, subtract all the three
// and store it at a memory location.
y1 = _mm512_load_pd(fa);
y2 = _mm512_load_pd(tempxyz);
y3 = _mm512_sub_pd(y1,y2);
__assume_aligned(f,64);
__assume((k*nd) % 8 == 0); // Here nd=3 and k is loop index variable.
_mm512_storenr_pd((f+k*nd), y3); // streaming store instruction
// --- GIVING SEG. FAULT !!!
} // end of k loop
}// end of compute function
오류 ('__mm_malloc' 등)에 대한 반환 값을 확인 했습니까? 또한 정확히 어디에서 segfault가 발생합니까? – kestasx
반환 값을 확인하지 않았지만 저장소 명령어가 코드에 추가 된 경우에만 segfault가 관찰됩니다. 상점 지시없이 모든 것이 잘 작동합니다. – user3778038
'_mm512_storenr_pd'에 할당 된 mamory에서 나가지 않습니까? 나는 (테스트 할 수 없다) 확실하지 않지만'f + np * nd' 이음새가있다. – kestasx