Я пытаюсь ускорить мой код, используя sse, и следующий код работает хорошо. В основном переменная __m128 должна указывать на 4 поплавка в строке, чтобы выполнить 4 операции одновременно.Адресация нецелого адреса и sse
Этот код эквивалентен вычислениям c[i]=a[i]+b[i]
с i
от 0
до 3
.
float *data1,*data2,*data3
// ... code ... allocating data1-2-3 which are very long.
__m128* a = (__m128*) (data1);
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
Однако, когда я хочу, чтобы сдвинуть чуток данные, которые я использую (см ниже), чтобы вычислить c[i]=a[i+1]+b[i]
с i
от 0
до 3
, он craches во время выполнения.
__m128* a = (__m128*) (data1+1); // <-- +1
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
Я думаю, что это связано с тем, что __m128 128 бит и поплавком данных 32 бита. Таким образом, может быть невозможно, если 128-битный указатель указывает на адрес, который не делится на 128.
В любом случае, вы знаете, в чем проблема и как я могу обойти его?
У вас есть неопределенное поведение. Указатель на 'float' * не * совпадает с указателем на' __m128'. Кроме того, когда вы делаете 'data1 + 1', это то же самое, что и' & data1 [1] ', действительно ли вы выделили более одного' float' и сохранили указатель в 'data1'? –
Да, в data1, data2, data3 есть много данных. Они хорошо распределены. – Oli
@JoachimPileborg, Что такое undedined поведение? Я знаю, что указатели на float и __m128 различны. Вот почему я бросил. __mm128 должен указывать на 4 поплавков подряд, чтобы выполнить все 4 операции одновременно на процессоре. – Oli