2012-05-01 4 views
0
내가 어떤 int temp[5] 다음 뭐죠 잘못 라인에 대한 포기 세그먼트 오류 아래 코드에서 SIMD에 A[j][k]-temp[] 일에 (con*A[r][k])를 저장하고 그것을위한 k=100

점점 오류 SIMD 연산

A[j][k]=((A[j][k]-con*A[r][k])%2); 

k=0에 대한 계산하려는

__m128i m5=_mm_sub_epi32(*m3,*m4);

while((k+4)<100) 
{  
    __m128i *m3 = (__m128i*)A[j+k]; 

    temp[0]=con*A[r][k]; 
    temp[1]=con*A[r][k+1]; 
    temp[2]=con*A[r][k+2]; 
    temp[3]=con*A[r][k+3]; 

    __m128i *m4 = (__m128i*)temp; 
    __m128i m5 =_mm_sub_epi32(*m3,*m4); 
    (temp_ptr)=(int*)&m5; 
    printf("%ld,%d,%ld\n",A[j][k],con,A[r][k]); 

    A[j][k] =temp_ptr[0]%2; 
    A[j][k+1]=temp_ptr[1]%2; 
    A[j][k+2]=temp_ptr[2]%2; 
    A[j][k+3]=temp_ptr[3]%2; 

    k=k+4; 
} 

답변

2

아마, 당신은 정렬 신경 안써. SIMD 명령어는 16 바이트 정렬이 필요합니다 (this 기사 참조). 그렇지 않으면 프로그램이 중단됩니다.

정렬 또는 어딘가에 잘못된 색인이 있고 잘못된 메모리에 액세스하십시오. 구현하려는 경우

1
J, K 가능한 값없이

, 그리고 그 이유를 말할 어렵다 R,하지만 가장 가능성이 당신이 overi 있습니다 귀하의 배열 중 하나를 ndexing

+0

이 줄에 오류가 발생했습니다 ...... _ m128i m5 = _mm_sub_epi32 (* m3, * m4); – abhinav

+0

이상의 색인 배열은 내가 확인한 문제가 아니 었습니다. – abhinav

+0

'A'의 크기는 무엇입니까? 'j'와'r'의 가능한 값은 무엇입니까? – Attila

0

는 :

for (k = 0; k < 100; k += 4) 
{ 
    A[j][k] = (A[j][k] - con * A[r][k]) % 2; 
} 

을하고 SIMD에서 일부 이익을보고 싶어, 당신은 SIMD와 스칼라 코드를 함께 사용하지 마십시오 SIMD에, 즉 모든 것을 할 필요가있다.

(안된) 예를 들어

:

const __m128i vcon = _mm_set1_epi32(con); 
const __m128i vk1 = _mm_set1_epi32(1); 
for (k = 0; k < 100; k += 4) 
{ 
    __m128i v1 = _mm_loadu_si128(&A[j][k]); // load v1 from A[j][k..k+3] (misaligned) 
    __m128i v2 = _mm_loadu_si128(&A[r][k]); // load v2 from A[r][k..k+3] (misaligned) 

    v2 = _mm_mullo_epi32(v2, vcon);   // v2 = con * A[r][k..k+3] 
    v1 = _mm_sub_epi32(v1, v2);    // v1 = A[j][k..k+3] - con * A[r][k..k+3] 
    v1 = _mm_and_si128(v1, vk1);   // v1 = (A[j][k..k+3] - con * A[r][k..k+3]) % 2 

    _mm_storeu_si128(&A[j][k], v1);   // store v1 back to A[j][k..k+3] (misaligned) 
} 

참고 : 당신은, 각 행의 다음로드를 정렬에 잘못 정렬로드/저장 (_mm_loadu_si128/_mm_storeu_si128)을 변경할 수 있습니다 정렬 16 바이트 /하다는 것을 보장 할 수있는 경우 stores (_mm_load_si128/_mm_store_si128) - 이는 목표로하는 CPU에 따라 성능을 다소 향상시킵니다.