2015-06-04 3 views
0

для моего текущего проекта Мне нужно создать вектор из 256-битных векторов AVX. Я использовалSegfault при создании вектора векторов avx

myVector = vector<__m256d>(nrVars(), _mm256_set1_pd(1.0)); 

который работал нормально один раз, но после выполнения линии дважды он дает мне ошибку сегментации. Мне удалось найти следующий код:

vector<__m256d> temp; 
__m256d entry = _mm256_set1_pd(1.0); 
temp = vector<__m256d>(10, entry); 
temp = vector<__m256d>(10, entry); 

, который всегда производит ошибку сегментации. Не могли бы вы объяснить мне, почему это так и как я могу избежать проблемы в будущем?

спасибо!

P.S. Даже это не сработало бы:

myVector.clear(); 
myVector.reserve(nrVars()); 
for (size_t i=0; i<nrVars(); ++i) { 
    myVector[i] = _mm256_set1_pd(1.0); 
} 

И ответить на комментарии. Это полный пример, который производит Segfault:

#include <vector> 
#include "immintrin.h" 

using namespace std; 
int main(int argc, char **argv) { 
    vector<__m256d> temp; 
    __m256d entry = _mm256_set1_pd(1.0); 
    temp = vector<__m256d>(10, entry); 
    temp = vector<__m256d>(10, entry); 
    return 0; 
} 

И читать на m256d и функций, которые я использую, пожалуйста, посмотрите на интел собственного веб-сайта (https://software.intel.com/sites/landingpage/IntrinsicsGuide/)

+0

Недостаточная информация. Предоставьте полный, минимальный, воспроизводимый, компилируемый пример, демонстрирующий проблему, а не случайно выбранные фрагменты кода. С C++ ошибка может привести к повреждению памяти в одной части вашего кода, которая не отображается до тех пор, пока затронутая память не будет доступна в другом месте, вызвав segfault. Просто потому, что вы сталкиваетесь в определенном месте, абсолютно ничего не говорит об этой конкретной части кода. Несмотря на то, что вы разместили минимальную полезную информацию, довольно вероятно, что ваша ошибка находится где-то в другом месте. Добро пожаловать на C++. –

+0

Вам нужно будет опубликовать дополнительную информацию относительно этого: '__m256d entry = _mm256_set1_pd (1.0);' .. более конкретно, что такое '__m256d' и что делает функция' _mm256_set1_pd' выглядеть/делать ?? – txtechhelp

+1

__mm256d является стандартным типом в AVX, а _mm256_set1_pd является стандартным внутренним. Он отметил вопрос AVX и не должен объяснять основы. Если вы неопытны чем-то, не обвиняйте плакат. – MuertoExcobito

ответ

3

AVX требует выровненную данных , vector не гарантирует, что элементы будут правильно выровнены. См. Этот вопрос (How is a vector's data aligned?) для обсуждения выравнивания распределения, особенно в отношении выполнения SIMD.

+0

спасибо, хотя похоже, что это будет болезненно для реализации ... Принят ваш ответ, как только я получу его, работая на моей машине. – user667804

+0

AVX фактически * не требует согласованных данных, если компилятор не генерирует 'vmovaps 'вместо' vmovups'. Невозможно выровнять операнды памяти с инструкциями без перемещений AVX. Только согласованные версии команд перемещения и хранения перемещаются. В некотором смысле, неплохо, что компиляторы избавят вас от более медленной производительности не выровненных данных, сделав ее ошибкой. –