Я пытаюсь избавиться от невыровненных загрузок и хранилищ для инструкций SSE для моего приложения, заменив
_mm_loadu_ps()
по
_mm_load_ps()
и выделение памяти с помощью:
float *ptr = (float *) _mm_malloc(h*w*sizeof(float),16)
вместо:
float *ptr = (float *) malloc(h*w*sizeof(float))
Однако, когда я печатаю адреса указателя, используя:
printf("%p\n", &ptr)
Я получаю вывод:
0x2521d20
0x2521d28
0x2521d30
0x2521d38
0x2521d40
0x2521d48
...
Это не 16-байтовое выравнивание, хотя я использовал функцию _mm_malloc?
И при использовании выровненных операций загрузки / сохранения для инструкций SSE я получаю ошибку сегментации, поскольку данные не выровнены по 16 байтам.
Есть идеи, почему он не выровнен должным образом, или есть другие идеи, чтобы это исправить?
Заранее спасибо!
Обновление
Использование
printf("%p\n",ptr)
решена проблема с выравниванием памяти, данные действительно правильно выровнены.
Однако я все еще получаю ошибку сегментации при попытке выровнять загрузку / сохранение этих данных, и я подозреваю, что это проблема с указателем.
При выделении памяти:
contents* instance;
instance.values = (float *) _mm_malloc(h*w*sizeof(float),16);
У меня есть структура с:
typedef struct{
...
float** values;
...
}contents;
В коде, который я затем выполняю в другой функции, указатель на содержимое передается в качестве аргумента:
__m128 tmp = _mm_load_ps(&contents.values);
Ребята, вы видите что-нибудь, чего мне не хватает?
Спасибо за всю помощь до сих пор:)