2014-12-31 2 views
1

두 개의 배열에 '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 
+0

오류 ('__mm_malloc' 등)에 대한 반환 값을 확인 했습니까? 또한 정확히 어디에서 segfault가 발생합니까? – kestasx

+0

반환 값을 확인하지 않았지만 저장소 명령어가 코드에 추가 된 경우에만 segfault가 관찰됩니다. 상점 지시없이 모든 것이 잘 작동합니다. – user3778038

+0

'_mm512_storenr_pd'에 할당 된 mamory에서 나가지 않습니까? 나는 (테스트 할 수 없다) 확실하지 않지만'f + np * nd' 이음새가있다. – kestasx

답변

1

'force'배열은 64 바이트로 정렬됩니다. 따라서 강제 배열에 대한 모든 액세스는 64 바이트 정렬되어야합니다. 즉, 액세스되는 요소의 주소는 64의 배수 여야합니다. load_pd 명령을 사용하여 한 번에 8 개의 double이로드됩니다. (f + k * nd)는 k = 1 일 때 세 번째 요소에 액세스하고 k = 2 일 때 여섯 번째 요소에 액세스합니다. 그러나 세 번째 요소의 시작 부분은 64 번째의 배수가 아닌 25 번째 바이트에 해당하며 세그 폴트가 발생하는 이유입니다 (다른 k 값과 유사). 따라서 수식을 사용하는 모든 액세스가 64의 배수가되도록 수식 (f + k * nd) 자체를 변경해야합니다.

관련 문제