如何使用__m256d
?
说我想要使用英特尔AVX指令_mm256_add_pd
一个简单Vector3
与3-64位级double
精密部件( x
, y
,和z
)。 什么是使用正确的方法是什么?
由于x
, y
和z
是成员 Vector3
类,_can我宣布他们在union
与__m256d
变量?
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
使用它们的地方注册为当地人接近? (我怕的酒店房间/ deskdrawer型问题)
编辑2:
我尝试添加一个__m256
寄存器我相当大的项目,我有一大堆
错误C2719:“值”:用__declspec(对齐('32' ))正式参数不对齐
错误,它使我相信,你不能让__m256
寄存器类内部,相反,他们应该被声明为本地人?