я пытаюсь избавиться от невыровненных загрузок и хранилищ для инструкций SSE для моего приложения, заменив
_mm_loadu_ps()
by
_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);
Вы, ребята, видите что-нибудь, чего мне не хватает? Спасибо за помощь :)
h * w * sizeof( float )
делится на 16? - person Christopher   schedule 13.12.2011_mm_load_ps(&contents.values)
на_mm_load_ps(contents.values)
, посколькуcontents.values
уже является указателем - та же проблема, что и ваша предыдущая проблема printf - у вас есть тенденция к чрезмерному разыменованию. ;-) - person Paul R   schedule 13.12.2011error: argument of type "float" is incompatible with parameter of type "const float *"
- person Ricky   schedule 13.12.2011float **
- это правильно? Но вы приписываете результат_mm_malloc
этому ??? - person Paul R   schedule 14.12.2011&contents.values
и даетAccess violation reading location 0x00000000.
- person Ricky   schedule 14.12.2011