16-байтовое выравнивание памяти с использованием инструкций SSE - PullRequest
4 голосов
/ 13 декабря 2011

Я пытаюсь избавиться от невыровненных загрузок и хранилищ для инструкций 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);

Ребята, вы видите что-нибудь, чего мне не хватает? Спасибо за всю помощь до сих пор:)

1 Ответ

4 голосов
/ 13 декабря 2011

Изменение:

printf("%p\n", &ptr)

на:

printf("%p\n", ptr)

Это память, на которую указывает ptr, должна быть выровнена на 16 байтов, а не сама переменная-указатель.

...