[英]Using __m256d registers
你如何使用__m256d
?
假設我想在具有_mm256_add_pd
位double
精度分量( x
, y
和z
)的簡單Vector3
類上使用Intel AVX指令_mm256_add_pd
。 使用它的正確方法是什么?
由於x
, y
和z
是Vector3
類的成員 ,_我可以將它們與__m256d
變量union
聲明嗎?
union Vector3
{
struct { double x,y,z ; } ;
__m256d _register ; // the Intel register?
} ;
然后我可以去:
Vector3 add( const Vector3& o )
{
Vector3 result;
result._register = _mm256_add_pd( _register, o._register ) ; // add 'em
return result;
}
這會起作用嗎? 或者我是否需要申報臨時工,
Vector3 add( const Vector3& o )
{
__m256d d1 = *(__m256d*)(&x) ; // ? Cast to __m256d?
__m256d d2 = *(__m256d*)(&o.x) ; // ? Cast to __m256d?
__m256d result = _mm256_add_pd( d1, d2 ) ; // add 'em
return Vector3( result ) ; // make a ctor that accepts __m256d?
}
我想出了這個例子,
#include <stdio.h>
#include <intrin.h>
int main()
{
__m256d a, b, res;
for( int i = 0; i < sizeof(__m256d)/sizeof(double); i++ )
{
a.m256d_f64[i] = i ;
b.m256d_f64[i] = 2*i ;
}
// Perform __4__ adds.
res = _mm256_add_pd(a, b);
for( int i = 0; i < sizeof(__m256d)/sizeof(double); i++ )
{
printf("%f + %f = %f\n", a.m256d_f64[i], b.m256d_f64[i], res.m256d_f64[i]);
}
puts("");
}
我想現在的問題是, 是否 _mm256_add_pd
自動執行負載操作,或將事情搞的一團糟,如果我沒有宣布我的__m256d
使用它們的地方注冊為當地人接近? (我害怕酒店房間/桌面抽屜式問題)
我嘗試在我相當大的項目中添加一個__m256
寄存器,我得到了很多
錯誤C2719:'value':帶__declspec的形式參數(align('32'))將不對齊
錯誤,它讓我相信你不能把__m256
寄存器放在一個類中,而應該聲明它們是本地的?
首先,我想澄清一點混亂。 __m256d
不是一種寄存器,它是一種可以加載到AVX寄存器的數據類型。 __m256d
不再是寄存器而是int
是寄存器。 有幾種方法可以將數據輸入和輸出__m256d
(或任何其他矢量類型):
使用union
:是的, union
技巧有效。 它工作得很好,因為聯合通常會有正確的對齊方式(盡管malloc
可能沒有,使用posix_memalign
或_aligned_malloc
)。
class Vector3 {
public:
Vector3(double xx, double yy, double zz);
Vector3(__m256d vvec);
Vector3 operator+(const Vector3 &other) const
{
return Vector3(_mm256_add_pd(vec, other.vec));
}
union {
struct {
double x, y, z;
};
__m256d vec; // a data field, maybe a register, maybe not
};
};
使用內在函數:在函數內部,通常使用內在函數來更容易地將數據輸入和輸出矢量類型。
__m256d vec = ...;
double x, y, z;
vec = _mm256_add_pd(vec, _mm256_set_pd(x, y, z, 0.0));
使用指針轉換:由於幾個原因, 轉換指針是最后的手段。
指針可能未正確對齊。
轉換指針有時會破壞編譯器的別名分析。
指針式鑄造繞過了許多安全保障。
所以我只使用指針轉換來瀏覽大量數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.