Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Битовая операция над 128-битным числом, SSE 
V
    Опции темы
ksili
Дата 6.5.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Решил освоить возможности SSE (2/3). В частности, работу со 128-битными целыми числами. И наткнулся на вот такую проблему. 
Есть массив 128-битных чисел (тип _m128i). Есть 128-битная маска, такого же типа. Вот такой код компилируется:
Код

__declspec(align(64)) __m128i *arr_128;
unsigned int K;
__m128i mask128;

....

arr_128 = new __m128i[K];

for(i = 0; i< K; i++)
{
   ....  // здесь готовим маску

   arr_128[i] = _mm_or_si128(arr_128[i], mask128);          // OR двух 128-разрядных чисел
}


Однако при выполнении на первой же команде  _mm_or_si128 происходит исключение
Цитата

Access violation reading location 0xffffffff

Память под массив перед этим выделяется нормально. В чём проблема не понятно. К тому же нашёл у Агнера Фога очень похожий код 
Код

a = _mm_or_si128(a, mask); 

который видимо является рабочим.

Это сообщение отредактировал(а) ksili - 6.5.2009, 12:05


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
nickless
Дата 7.5.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



А если так (задекларировать указатель выровненым на 16 байт ИМХО не достаточно)?
Код

#include <cstdlib>
#include <malloc.h>
#include <emmintrin.h>

void *operator new(size_t aSize) {
#ifdef _WIN32
    return _aligned_malloc(aSize, 16);
#else
    void *ret;
    posix_memalign((void**)&ret, 16, aSize);
    return ret;
#endif
}

void operator delete( void * aData) {
#ifdef _WIN32
    _aligned_free(aData);
#else
    free(aData);
#endif
}

int main() {
    const int K = 8;
    __m128i mask128 = _mm_set_epi32(0x11111111, 0xffffffff, 0x00000008, 0x00000004);
    __m128i * arr_128 = new __m128i[K];

    for(int i = 0; i< K; i++) {
        arr_128[i] = _mm_set1_epi32(i);
    }

    for(int i = 0; i< K; i++) {
        arr_128[i] = _mm_or_si128(arr_128[i], mask128);
    }

    delete[] arr_128;
    return 0;
}



--------------------
user posted image

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
PM MAIL   Вверх
ksili
Дата 8.5.2009, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 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 байта я конечно загнул, спасибо, что поправили.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
nickless
Дата 8.5.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(ksili @  8.5.2009,  05:48 Найти цитируемый пост)
nickless, не вижу принципиальных отличий

Насколько я понимаю, __align указывает выравнивание только самой переменной, т.е. указателя arr_128, а тебе надо чтобы память выделенная new была выравнена на 16 байт, иначе будет access violation. Посмотри на значение arr_128 % 16 и всё станет ясно.

Добавлено через 21 секунду
ЗЫ. В MSDN об этом кстати тоже написано.

Добавлено через 2 минуты и 23 секунды
ksili, ты кстати мой код пробовал? У меня на линуксе он работает нормально.


--------------------
user posted image

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
PM MAIL   Вверх
ksili
Дата 12.5.2009, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



nickless, спасибо. Благодаря вашим комментариям, вопрос решён.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.