Ошибка сегментации Intel SSE Intrinsics _mm_load_si128,

В настоящее время я работаю с матрицей 5 x 5, используя функции SSE.

Я пытаюсь загрузить x4 128-битные целочисленные значения в регистры xmm следующим образом:

#include <emmintrin.h>
#include <smmintrin.h>
//===================================== Initialising matrix

int* aligned_matrix;
posix_memalign((void **)&aligned_matrix, 16, sizeof(int) * 25);

for (ssize_t i = 0; i < 25; i++) 
    aligned_matrix[i] = 2; // uniform value of 2 assigned
}
return aligned_matrix;
}

//===================================== then, 

__m128i xmm8, xmm9; 

xmm8 = _mm_load_si128((__m128i *)(aligned_matrix)); // read 4 from first row

// this line below is where the segmentation fault occurs...
xmm9 = _mm_load_si128((__m128i *)(aligned_matrix + 5)); // 4 from next row

У меня есть ощущение, что это может быть связано с выравниванием памяти или чем-то еще, но... я не могу точно определить, где я ошибаюсь...

Я использую следующее,

лязг -msse -msse2 -msse4.1

* Примечание. Причина, по которой я добавляюalign_matrix + 5, заключается в том, чтобы прочитать следующие 4 элемента из второй строки матрицы 5x5.


person lukieleetronic    schedule 17.05.2015    source источник


Ответы (1)


Для второй загрузки вам нужно использовать _mm_loadu_si128, потому что исходные данные не выровнены. Объяснение: смещение +5 целых от базового адреса, выровненного по 16 байтам, больше не будет выравниваться по 16 байтам.

person Paul R    schedule 17.05.2015
comment
почему это имеет значение? Все, что я пытаюсь здесь сделать, это прочитать первые 4 элемента первой строки, затем перейти к следующей строке и прочитать следующие 4 элемента. Чтобы перейти к следующей строке, мне нужно выровнять_матрицу + 5, так как это матрица 5 x 5. - person lukieleetronic; 17.05.2015
comment
Вау, это работает! большое спасибо. Кстати, если я использую невыровненную загрузку, будет ли негативное влияние на производительность по сравнению с выровненной загрузкой? - person lukieleetronic; 17.05.2015
comment
На старых процессорах да, но на новых процессорах штраф намного меньше, но его все равно следует избегать, где это возможно. - person Paul R; 17.05.2015