Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Битовая операция над 128-битным числом |
Автор: ksili 6.5.2009, 11:50 | ||||||
Решил освоить возможности SSE (2/3). В частности, работу со 128-битными целыми числами. И наткнулся на вот такую проблему. Есть массив 128-битных чисел (тип _m128i). Есть 128-битная маска, такого же типа. Вот такой код компилируется:
Однако при выполнении на первой же команде _mm_or_si128 происходит исключение
Память под массив перед этим выделяется нормально. В чём проблема не понятно. К тому же нашёл у Агнера Фога очень похожий код
который видимо является рабочим. |
Автор: nickless 7.5.2009, 19:27 | ||
А если так (задекларировать указатель выровненым на 16 байт ИМХО не достаточно)?
|
Автор: ksili 8.5.2009, 06:48 |
nickless, не вижу принципиальных отличий. Проблема была почему-то с чтением из массива типа __m128i, когда он был в качестве аргумента какой-нибудь SSE-шной функции, как _mm_or_si128 в примере. Я сейчас уже сделал так, что работаю с двумя 64-битными переменными (__int64 qwords[2]), а потом пишу их в arr_128[i] командой memcpy. Хотел было вместо memcpy копировать командой _mm_set_epi64x, но оказалось, что она из SSE3, а мой проц его не поддерживает - illegal instruction. С выравниванием на 64 байта я конечно загнул, спасибо, что поправили. |
Автор: nickless 8.5.2009, 21:01 |
Насколько я понимаю, __align указывает выравнивание только самой переменной, т.е. указателя arr_128, а тебе надо чтобы память выделенная new была выравнена на 16 байт, иначе будет access violation. Посмотри на значение arr_128 % 16 и всё станет ясно. Добавлено через 21 секунду ЗЫ. В http://msdn.microsoft.com/en-us/library/83ythb65(VS.80).aspx об этом кстати тоже написано. Добавлено через 2 минуты и 23 секунды ksili, ты кстати мой код пробовал? У меня на линуксе он работает нормально. |
Автор: ksili 12.5.2009, 05:02 |
nickless, спасибо. Благодаря вашим комментариям, вопрос решён. |