【发布时间】:2011-07-13 12:50:46
【问题描述】:
我有一些在 4D 向量上运行的代码,我目前正在尝试将其转换为使用 SSE。我在 64b linux 上同时使用 clang 和 gcc。
仅对向量进行操作都可以很好地掌握。但现在有一部分我必须将整个向量乘以一个常数 - 像这样:
float y[4];
float a1 = 25.0/216.0;
for(j=0; j<4; j++){
y[j] = a1 * x[j];
}
到这样的事情:
float4 y;
float a1 = 25.0/216.0;
y = a1 * x;
在哪里:
typedef double v4sf __attribute__ ((vector_size(4*sizeof(float))));
typedef union float4{
v4sf v;
float x,y,z,w;
} float4;
这当然行不通,因为我正在尝试对不兼容的数据类型进行乘法运算。
现在,我可以这样做:float4 a1 = (v4sf){25.0/216.0, 25.0/216.0, 25.0/216.0, 25.0/216.0}
但只是让我觉得很傻,即使我写了一个宏来做到这一点。
另外,我很确定这不会产生非常高效的代码。
谷歌搜索没有得到明确的答案(见Load constant floats into SSE registers)。
那么,将整个向量乘以同一个常数的最佳方法是什么?
【问题讨论】:
-
我认为你需要在上面
s/double/float/g- SSE 向量可以容纳 4 个浮点数或 2 个双精度数。