Ошибка сегментации из-за выравнивания памяти в SSE - PullRequest
0 голосов
/ 17 декабря 2010

Я работаю над обнаружением лица, в котором я принимаю ввод в виде файла .bmp, определяю лицо и рисую прямоугольник на лице.

Но когда я добавляю функцию с именем "cvDetect"чтобы обнаружить лицо, я получаю некоторую ошибку сегментации, в следующей строке кода:

_mm_store_ps(&c(y, 4.0*x), _mm_sub_ps(_mm_load_ps(a.data(y, 4.0*x)), _mm_load_ps(b.data(y, 4.0*x))));

Во время отладки я обнаружил, что из-за этих функций возникает некоторая проблема с выравниванием памяти.Может кто-нибудь помочь в решении этой проблемы, код на C ++, и я использую Linux.

Ответы [ 4 ]

2 голосов
/ 17 декабря 2010

Я действительно ничего не знаю об этих расширениях SSE, но, похоже, у вас проблемы с выравниванием переменных. Чтобы объявить определенное выравнивание с объявлением переменной, требуются непереносимые расширения, которые зависят от вашего компилятора.

Для GCC вы бы объявили свою переменную примерно так:

// Declare a variable called 'a' of type __m128, aligned at 16 bytes.
__m128 a __attribute__((aligned (16)));

Для Microsoft Visual C ++ вы должны сделать что-то вроде этого:

__declspec(align(16)) __m128 a;
1 голос
/ 17 декабря 2010

Быстрое решение на данный момент - использование невыровненных нагрузок и хранилищ, т.е.

_mm_storeu_ps(&c(y, 4.0*x), _mm_sub_ps(_mm_loadu_ps(a.data(y, 4.0*x)), _mm_loadu_ps(b.data(y, 4.0*x))));

Будет снижение производительности, если вы не используете Core i5 / i7, но, по крайней мере, оно будет работать правильно.

В конечном счете, вам нужно убедиться, что ваши данные всегда выровнены на 16 байт.

0 голосов
/ 16 декабря 2011

Похоже, a.data (r, c) - это вызов оператора () для объекта с именем a, который возвращает ссылку на некоторую память.

Эта память должна была быть выделена с помощью _mm_malloc или _aligned_malloc , если вы используете Visual Studio (а не new или таНос ).

Если память не выделена динамически, но является полем в каком-либо объекте, поле должно быть объявлено с атрибутом выравнивания, подобным тому, который указан в ответе asveikau.

0 голосов
/ 17 декабря 2010

_ps функции требуют 16-байтовых выровненных операндов памяти

...