2015-05-17 4 views
1

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

Я пытаюсь загрузить целые значения x4 128bit в регистры 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

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

ответ

2

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

+0

Почему это имеет значение? Все, что я пытаюсь сделать, это прочитать первые 4 элемента первой строки, затем перейти к следующей строке и прочитать следующие 4 элемента. Чтобы перейти к следующей строке, мне нужно «aligned_matrix + 5», так как это 5 x 5 матриц. – lukieleetronic

+0

ОК - это неясно из вашего вопроса - ответ обновлен. –

+0

Ничего себе это работает! большое спасибо. Кстати, если я использую невыровненную нагрузку, будет ли отрицательное влияние на производительность по сравнению с выровненной нагрузкой? – lukieleetronic