![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ksili |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Решил освоить возможности SSE (2/3). В частности, работу со 128-битными целыми числами. И наткнулся на вот такую проблему.
Есть массив 128-битных чисел (тип _m128i). Есть 128-битная маска, такого же типа. Вот такой код компилируется:
Однако при выполнении на первой же команде _mm_or_si128 происходит исключение
Память под массив перед этим выделяется нормально. В чём проблема не понятно. К тому же нашёл у Агнера Фога очень похожий код
который видимо является рабочим. Это сообщение отредактировал(а) ksili - 6.5.2009, 12:05 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||
|
|||||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
А если так (задекларировать указатель выровненым на 16 байт ИМХО не достаточно)?
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
nickless, не вижу принципиальных отличий. Проблема была почему-то с чтением из массива типа __m128i, когда он был в качестве аргумента какой-нибудь SSE-шной функции, как _mm_or_si128 в примере. Я сейчас уже сделал так, что работаю с двумя 64-битными переменными (__int64 qwords[2]), а потом пишу их в arr_128[i] командой memcpy. Хотел было вместо memcpy копировать командой _mm_set_epi64x, но оказалось, что она из SSE3, а мой проц его не поддерживает - illegal instruction.
С выравниванием на 64 байта я конечно загнул, спасибо, что поправили. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Насколько я понимаю, __align указывает выравнивание только самой переменной, т.е. указателя arr_128, а тебе надо чтобы память выделенная new была выравнена на 16 байт, иначе будет access violation. Посмотри на значение arr_128 % 16 и всё станет ясно. Добавлено через 21 секунду ЗЫ. В MSDN об этом кстати тоже написано. Добавлено через 2 минуты и 23 секунды ksili, ты кстати мой код пробовал? У меня на линуксе он работает нормально. -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
nickless, спасибо. Благодаря вашим комментариям, вопрос решён.
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |