【发布时间】:2016-05-04 15:53:38
【问题描述】:
我想将 SSE 指令应用于包含复数的向量。如果没有 SSE 说明,我可以使用以下代码来完成。但是,当我应用 SSE 指令时,我不知道如何将计算出的实部和虚部返回到数组中。我该如何解决这个问题?
complex double * complexScaling(complex double *input, double c, int length)
{
for(int i=0; i<length; i++) {
input[i] = c*input[i];
}
return input;
}
complex double * complexScalingSSE(complex double *input, double c, int length)
{
__m128d multiplier,real,imag;
multiplier = _mm_set1_pd(c);
for(int i=0; i<length; i+=2) {
real = _mm_set_pd(creal(input[i]),creal(input[i+1]));
real = _mm_mul_pd(real, multiplier);
imag = _mm_set_pd(cimag(input[i]),cimag(input[i+1]));
imag = _mm_mul_pd(imag, multiplier);
}
return input;
}
【问题讨论】:
-
您的 SSE 级别是多少? CPUID 指示了几个指令集:1, 2, 3, 4, 4.1, 4.2, AVX, AVX2, FMA3, FMA4, BMI, BMI2, ... 我问这个,因为用 FMAx 计算复数是一个蛋糕...
-
使用_mm_store*,_mm_storeu_pd 或 _mm_store_pd
-
必须兼容SSE2
-
任何看起来像
set(var, var)的东西都会产生非常烦人的代码。唯一安全的集合是带有常量参数。