2015-06-05 3 views
2

Когда я бегу простой цикл нагрузки, вычитать и умножать с помощью встроенных функций AVX Я постоянно получаю следующее сообщение об ошибке,Intel AVX ошибка умножения в C,

Process terminating with default action of signal 11 (SIGSEGV) 
==2995== General Protection Fault 

из кода C,

double res[4] = {0.0, 0.0, 0.0, 0.0}; 
for(int i = 0; i < 10; i++){ 
      ymm0 = _mm256_loadu_pd(vector_a); 
      ymm1 = _mm256_loadu_pd(vector_b); 
      ymm2 = _mm256_sub_pd(ymm0, ymm1); 
      ymm4 = _mm256_mul_pd(ymm2, ymm2); <--- Valgrind terminated 
      _mm256_store_pd((double*)res, ymm4); 
} 

Может ли кто-нибудь помочь?

в настоящее время используют лязг с #include <immintrin.h>

==== ==== EDIT

Для уточнения, я загружая follwing значения,

double vector_a[4] = {0.145000, 1.145000, 2.145000, 3.145000}; 
double vector_b[4] = {0.145000, 1.145000, 2.145000, 3.145000}; 
+2

Это грохот в магазине, а не размножается. – Mysticial

+0

Убедитесь, что 'res' указывает правильное местоположение в памяти. –

+0

double res [4] = {0,0,0,0,0,0,0,0}; <- будет ли это проблемой? – lukieleetronic

ответ

3

Используйте _mm256_storeu_pd. Так же, как и ваши нагрузки, требуется неравномерное хранилище, потому что массивы не гарантируются надлежащим образом для AVX.

+0

святой ... он исправил это! Но .. как бы выровнять массив? это должно быть как 256bit выровнено или что-то, используя posix memalign или подобное? – lukieleetronic

+1

posix memalign - это то, что я бы использовал. –

+1

@lukieleetronic Это, вероятно, не стоит выравнивать массив, если он только для вывода операции. Но вам нужно либо использовать что-то вроде memalign, либо выделять статически с __attribute __ ((aligned (32))). Более поздняя версия не будет работать с нестатической локальной переменной. –

Смежные вопросы