2015-07-02 1 views
1

У меня есть структура определяется как:Каков самый быстрый способ загрузить первую строку структуры 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?

ответ

4

Использовать встроенный _mm256_load_si256. Цитирование в Intel Intrinsics Guide:

__m256i _mm256_load_si256 (__m256i Const * mem_addr)

#include "immintrin.h"

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

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

+0

Могу ли я использовать его как: _m256i loc = _mm256_load_si256 (Horstruct.v [0])? –

+1

@ user1979163 Вам, вероятно, понадобится указать указатель для его компиляции: '__m256i loc = _mm256_load_si256 (reinterpret_cast <__ m256i const *> (hs.v));'. – ComicSansMS

+1

В последнем Intel HW, если адрес * * выровнен, 'movdqu' будет иметь такую ​​же задержку, что и' movdqa'. Кроме того, до тех пор, пока нагрузка не разделяет кешлю (или, что еще хуже, границу страницы), почти не будет штрафа за невыложенные нагрузки. –

Смежные вопросы