int MAX_DIM = 100;
float a[MAX_DIM][MAX_DIM]__attribute__ ((aligned(16)));
float b[MAX_DIM][MAX_DIM]__attribute__ ((aligned(16)));
float d[MAX_DIM][MAX_DIM]__attribute__ ((aligned(16)));
/*
* I fill these arrays with some values
*/
for(int i=0;i<MAX_DIM;i+=1){
for(int j=0;j<MAX_DIM;j+=4){
for(int k=0;k<MAX_DIM;k+=4){
__m128 result = _mm_load_ps(&d[i][j]);
__m128 a_line = _mm_load_ps(&a[i][k]);
__m128 b_line0 = _mm_load_ps(&b[k][j+0]);
__m128 b_line1 = _mm_loadu_ps(&b[k][j+1]);
__m128 b_line2 = _mm_loadu_ps(&b[k][j+2]);
__m128 b_line3 = _mm_loadu_ps(&b[k][j+3]);
result = _mm_add_ps(result, _mm_mul_ps(_mm_shuffle_ps(a_line, a_line, 0x00), b_line0));
result = _mm_add_ps(result, _mm_mul_ps(_mm_shuffle_ps(a_line, a_line, 0x55), b_line1));
result = _mm_add_ps(result, _mm_mul_ps(_mm_shuffle_ps(a_line, a_line, 0xaa), b_line2));
result = _mm_add_ps(result, _mm_mul_ps(_mm_shuffle_ps(a_line, a_line, 0xff), b_line3));
_mm_store_ps(&d[i][j],result);
}
}
}
SSE를 사용하여 행렬 곱셈을 만들었습니다. 코드는 흐름으로 실행됩니다. 행에서 4 개의 요소를 취하여 b의 열에서 4 개의 요소로 곱한 후 다음 열의 4 개 요소로 이동하여 열 b의 다음 4 개 요소로 이동SSE 내장 함수를 사용하는 크기 100 * 100의 행렬
오류가 발생합니다.
내가 우분투에 GCC 5.4.0을 사용하는 이유 Segmentation fault (core dumped)
난 정말 모르는 16.04.5
편집 : 분할 오류가 _mm_loadu_ps 에 의해 해결되었다 또한 내가 만약 greatfull 될 것입니다 논리에 문제가있다 누군가 나를 찾을 수 있도록 도와줍니다.
Linux에서 GCC를 사용하고있는 것 같습니다. 다음 정보로 게시물을 업데이트하십시오. a) OS, b) 컴파일러 및 버전, c) gdb에서 실행 (해당되는 경우)하고 스택 추적을 복사/붙여 넣기하십시오. – paulsm4
로드 중 일부 (마지막 세 개)의 정렬이 잘못되었습니다.이 경우 (또는 모든 경우에 대해) '_mm_loadu_ps'를 사용하십시오. –