2016-04-23 57 views
1

我有兴趣将__m256i数据类型(在英特尔内部函数中用于AVX指令)的数据复制到新的__m256i中。复制__m256i数据类型

我知道我可以将数据从AVX寄存器存储到内存,然后从内存中,我可以加载数据到一个新的寄存器。但是,有没有更简单的方法(即专用指令),我可以直接“克隆”寄存器,而无需先使用操作将其存储到内存中,然后再次加载它?

我想,我可以添加一个空的寄存器到我的寄存器,然后得到一个新的__m256i类型回来,可以加载到一个寄存器...这似乎有点破解,但是,并要求我使用一些操作可以在某个时刻创建一个新的空__m256i哑元。

对不起,如果它是一个简单的问题(这是一个简单的问题)。我只是无法找到一个可以为我做到这一点的内在功能。

回答

3

您可以通过常规方式进行分配,例如,

__m256i v1 = _mm256_set1_epi32(42); 
__m256i v2 = v1; 

编译器将典型地产生一个vmovdqa指令(或者其甚至可以仅优化掉寄存器副本)。

+0

啊,真是太棒了。很难在英特尔内部网着陆页上找到有用的信息,但这使得它非常简单!我原以为这将被作为参考处理,因此它们指向相同的数据元素! – oPolo

+0

是的,现在它可能看起来非常明显,但您可以像处理任何其他简单类型一样处理'__m256i',例如,就整个基础操作而言。正如“int”可能被编译器分配给通用标量寄存器,“__m256i”可能会被分配给“ymm”寄存器。 –

1

可以很容易地在x86汇编复制YMM寄存器使用MOVDQA

vmovdqa ymm0, ymm1 

的对应的固有的,这是

_mm256_store_si256(_m256i *p, __m256i a); 

编译器应优化掉任何变量引用另一个。

+0

非常感谢。我完全误解了英特尔的文档。这有帮助! – oPolo

+1

我不会推荐在局部变量之间复制数据的'store'内部函数,在这种情况下,您并不希望实际存储内存。 'store' /'storeu'内在函数主要用于向编译器传递对齐保证,否则你只需写'* p = a;' –