Я хочу умножить два (float/double) вектора с операторами AVX. Для этого мне нужна выровненная память. Моя функция для значений с плавающей точкой является:Выравнивание double vs align float для операций AVX
#define SIZE 65536
float *g, *h, *j;
g = (float*)aligned_alloc(32, sizeof(float)*SIZE);
h = (float*)aligned_alloc(32, sizeof(float)*SIZE);
j = (float*)aligned_alloc(32, sizeof(float)*SIZE);
//Filling g and h with data
for(int i = 0; i < SIZE/8; i++)
{
__m256 a_a, b_a, c_a;
a_a = _mm256_load_ps(g+8*i);
b_a = _mm256_load_ps(h+8*i);
c_a = _mm256_mul_ps(a_a, b_a);
_mm256_store_ps (j+i*8, c_a);
}
free(g);
free(h);
free(j);
Это работает, но когда я пытаюсь сделать это с двойными значениями, я получаю сообщение об ошибке доступа к памяти (например, если память не выровнена):
double *g_d, *h_d, *i_d;
g_d = (double*)aligned_alloc(32, sizeof(double)*SIZE);
h_d = (double*)aligned_alloc(32, sizeof(double)*SIZE);
i_d = (double*)aligned_alloc(32, sizeof(double)*SIZE);
for(int i = 0; i < SIZE/4; i++)
{
__m256d a_a, b_a, c_a;
a_a = _mm256_load_pd(g_d+4*i);
b_a = _mm256_load_pd(h_d+4*i);
c_a = _mm256_mul_pd(a_a, b_a);
_mm256_store_pd (i_d+i*4, c_a);
}
free(g_d);
free(h_d);
free(i_d);
Почему выравнивание не работает для double
-значений?
При запуске его в БГД, я получаю
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401669 in _mm256_load_pd (__P=0x619f70) at /usr/lib/gcc/x86_64-linux-gnu/5/include/avxintrin.h:836
Edit: я нашел мою ошибку, это была ошибка копирования/вставки из прежней функции, которая проявляется в этой функции. Из-за того, что вы не помогаете другим (как я полагаю), я закрываю вопрос.
Эти имена идентификаторов сосут камни. Какая черта, б, д? Всегда копируйте/вставляйте код из текстового редактора. Из тестовой программы, которая имеет эту проблему, никогда ничего не делайте. –
Исправлены переменные, но позже будет добавлена короткая тестовая программа. –
Работы для меня (тм). Вы использовали отладчик? Точно, в какой строке это происходит, и каково значение адреса, которое он читает (или пишет?). Каков точный код отказа. –