Каков самый быстрый способ загрузить первую строку структуры 2x4 64b в регистр 256b в AVX2?

У меня есть структура, определенная как:

struct HorStruct {
    uint64_t v[2][4];
    typedef uint64_t value_type;
    typedef uint64_t* iterator;
    typedef const uint64_t* const_iterator;
    typedef value_type& reference;
    typedef const value_type& const_reference;
    typedef size_t size_type;
    typedef ptrdiff_t difference_type;
    typedef uint64_t* pointer;
    typedef const uint64_t* const_pointer;
    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;};

Мне интересно, как я могу загрузить его первую строку в переменную _m256i на AVX2?


person Yigit Demirag    schedule 02.07.2015    source источник


Ответы (1)


Используйте встроенную функцию _mm256_load_si256. Цитата из Руководства по внутренним компонентам Intel:

__m256i _mm256_load_si256 (__m256i константа * адрес_памяти)

#include "immintrin.h"

[...] Описание Загрузить 256-битные целочисленные данные из памяти в dst. mem_addr должен быть выровнен по 32-байтовой границе, иначе может быть сгенерировано исключение общей защиты.

Если требование выравнивания является проблемой, вы можете использовать невыровненную версию _mm256_loadu_si256. Обратите внимание, однако, что выровненные нагрузки могут быть значительно быстрее.

person ComicSansMS    schedule 02.07.2015
comment
Могу ли я использовать его как: _m256i loc = _mm256_load_si256 (Horstruct.v[0])? - person Yigit Demirag; 02.07.2015
comment
@user1979163 user1979163 Вам, вероятно, потребуется указать указатель для его компиляции: __m256i loc = _mm256_load_si256(reinterpret_cast<__m256i const*>(hs.v));. - person ComicSansMS; 02.07.2015
comment
В последних аппаратных средствах Intel, если адрес выровнен, movdqu будет иметь ту же задержку, что и movdqa. Кроме того, пока загрузка не разделяет строку кэша (или, что еще хуже, границу страницы), штрафа за невыровненные загрузки почти нет. - person Peter Cordes; 03.07.2015
comment
@ComicSansMS Спасибо за ваш ответ. Есть ли у вас какие-либо советы для выполнения обратной операции? 2x 256b регистров в структуру 2x4 64b? - person Yigit Demirag; 08.07.2015
comment
@YigitDemirag Соответствующая встроенная функция будет _mm256_store_si256. Вам следует ознакомиться с Руководством по внутренним элементам, указанным в исходном ответе. Это весьма полезно для решения подобных вопросов. - person ComicSansMS; 08.07.2015
comment
@ComicSansMS Да, ты прав. Но моя главная проблема в том, что я не знаю, как поместить значения этого регистра в определенную строку матрицы векторизованным способом. Я думаю, что мне следует использовать некоторый кастинг, как вы предлагали ранее, верно? - person Yigit Demirag; 08.07.2015
comment
@YigitDemirag Просто убедитесь, что указатели указывают на правильное место, а затем приведите к хранилищу, чтобы компилятор был доволен. Как uint64_t v[2][4]; __m256 r1, r2; _mm256_store_si256(reinterpret_cast<__m256i*>(v[0]), r1); _mm256_store_si256(reinterpret_cast<__m256i*>(v[1]), r2);. - person ComicSansMS; 08.07.2015
comment
@ComicSansMS Большое спасибо. Я понял это пару секунд назад :) - person Yigit Demirag; 08.07.2015