gct*_*gct 5 c gcc sse simd vectorization
我在我的内部循环中有一些代码,我正在使用它来为我正在编写的光栅化算法钳制一些错误值:
float cerror[4] = {
MINF(error[0], 1.0f),
MINF(error[1], 1.0f),
MINF(error[2], 1.0f),
MINF(error[3], 1.0f)
};
Run Code Online (Sandbox Code Playgroud)
MINF只是MINF(a,b)=((a)<(b))?(a):( b)
事实证明我有4个错误值我必须在这个内部循环更新所有浮点数,所以如果我能将它们全部存储在SSE寄存器中并且使用minps计算最小值而不是单独计算,那就太好了,但是编译器似乎并没有为我做这件事.
我甚至尝试将它移动到它自己的功能,所以我可以看到矢量化器输出:
void fclamp4(float* __restrict__ aa, float* __restrict__ bb) {
for (size_t ii=0; ii < 4; ii++) {
aa[ii] = (bb[ii] > 1.0) ? 1.0f : bb[ii];
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我类似的东西:
inc/simplex.h:1508:注意:未向量化:不支持的数据类型bool
inc/simplex.h:1507:注意:函数中的向量化0循环.
有没有办法更好地鼓励编译器为我做这个?如果我可以避免它,我宁愿不直接跳到教义,所以代码仍然是可移植的.是否有共同模式的一般参考?
最后,我的所有错误/错误/错误增量都存储在堆栈上的float [4]数组中,我是否需要手动对齐它们,或者编译器能否为我处理?
编辑:使用对齐类型进行游戏但仍然没有骰子.
#include <stdio.h>
#include <stdlib.h>
typedef float __attribute__((aligned (16))) float4[4];
inline void doit(const float4 a, const float4 b, float4 c) {
for (size_t ii=0; ii < 4; ii++) {
c[ii] = (a[ii] < b[ii]) ? a[ii] : b[ii];
}
}
int main() {
float4 a = {rand(), rand(), rand(), rand() };
float4 b = {1.0f, 1.0f, 1.0f, 1.0f };
float4 c;
doit((float*)&a, (float*)&b, (float*)&c);
printf("%f\n", c[0]);
}
Run Code Online (Sandbox Code Playgroud)
矢量化器说:
ssetest.c:7:注意:vect_model_load_cost:对齐.
ssetest.c:7:注意:vect_model_load_cost:inside_cost = 4,outside_cost = 0.
ssetest.c:7:注意:vect_model_load_cost:对齐.
ssetest.c:7:注意:vect_model_load_cost:inside_cost = 4,outside_cost = 0.
ssetest.c:7:注意:未向量化:不支持相关的stmt:D.3177D.3177_22 = iftmp.4_18 <iftmp.4_21;ssetest.c:12:注意:函数中的向量化0循环.
再次编辑:我应该注意到我一直在GCC 4.4.7(RHEL 6)和GCC 4.6(Ubuntu)上尝试这个,两者都没有运气.
看起来在 GCC 中,除非指定 -ffast-math 或 -fassociative-math,否则不会启用缩减矢量化。当我启用它们时,它可以很好地矢量化(在内部循环中使用 fminf):
ssetest.c:9:注意:vect_model_load_cost:对齐。
ssetest.c:9:注意:vect_model_load_cost: inside_cost = 1,outside_cost = 0 。
ssetest.c:9:注意:vect_model_load_cost:对齐。
ssetest.c:9:注意:vect_model_load_cost: inside_cost = 1,outside_cost = 0 。
ssetest.c:9:注意:vect_model_simple_cost: inside_cost = 1,outside_cost = 0 。
ssetest.c:9:注意:vect_model_store_cost: inside_cost = 1,outside_cost = 0 。
ssetest.c:9: 注意:成本模型分析:
循环内部向量成本: 4
循环外部向量成本: 0
标量迭代成本: 4
标量外部成本: 0
序言迭代: 0
尾声迭代: 0
计算的盈利最小迭代数: 1ssetest.c:9:注意:盈利阈值 = 3
ssetest.c:9:注意:循环矢量化。
ssetest.c:15:注意:函数中的向量化 1 循环。
归档时间: |
|
查看次数: |
557 次 |
最近记录: |