【发布时间】:2014-12-04 12:41:34
【问题描述】:
我正在学习 AVX 内在用法,问题是如何优化以下代码。我将它移植到内在工作的方式,但我有一种不好的感觉,它变得更容易和更高效。
c++伪代码版
float min_value = FLOAT_MAX;
float result_p = 0;
for loop
{
float u = ....
if(u > 0.0f || u < 1.0f)
continue;
float p = ...
float t = ....
if(t < min_value)
{
min_value = t;
result_p = p;
}
}
我使用以下代码对此进行了优化:
int resultMask = 0
float min_value = FLOAT_MAX;
float result_p = 0;
for loop
{
__m256 u = ....
if(u.m256_f32[0] < 0.0f || u.m256_f32[0] > 1.0f) resultMask &= 0xFE;
if(u.m256_f32[1] < 0.0f || u.m256_f32[1] > 1.0f) resultMask &= 0xFD;
if(u.m256_f32[2] < 0.0f || u.m256_f32[2] > 1.0f) resultMask &= 0xFB;
if(u.m256_f32[3] < 0.0f || u.m256_f32[3] > 1.0f) resultMask &= 0xF7;
if(u.m256_f32[4] < 0.0f || u.m256_f32[4] > 1.0f) resultMask &= 0xEF;
if(u.m256_f32[5] < 0.0f || u.m256_f32[5] > 1.0f) resultMask &= 0xDF;
if(u.m256_f32[6] < 0.0f || u.m256_f32[6] > 1.0f) resultMask &= 0xBF;
if(u.m256_f32[7] < 0.0f || u.m256_f32[7] > 1.0f) resultMask &= 0x7F;
if(resultMask == 0)
continue;
__m256 p = ...
__m256 t = ....
if(resultMask & 0x01) if(t.m256_f32[0] < min_value) {min_value = t.m256_f32[0]; result_p = p.m256_f32[0];}
if(resultMask & 0x02) if(t.m256_f32[1] < min_value) {min_value = t.m256_f32[1]; result_p = p.m256_f32[1];}
if(resultMask & 0x04) if(t.m256_f32[2] < min_value) {min_value = t.m256_f32[2]; result_p = p.m256_f32[2];}
if(resultMask & 0x08) if(t.m256_f32[3] < min_value) {min_value = t.m256_f32[3]; result_p = p.m256_f32[3];}
if(resultMask & 0x10) if(t.m256_f32[4] < min_value) {min_value = t.m256_f32[4]; result_p = p.m256_f32[4];}
if(resultMask & 0x20) if(t.m256_f32[5] < min_value) {min_value = t.m256_f32[5]; result_p = p.m256_f32[5];}
if(resultMask & 0x40) if(t.m256_f32[6] < min_value) {min_value = t.m256_f32[6]; result_p = p.m256_f32[6];}
if(resultMask & 0x80) if(t.m256_f32[7] < min_value) {min_value = t.m256_f32[7]; result_p = p.m256_f32[7];}
}
所有“如果”都很丑陋,但我找不到其他解决方案。有人知道如何改变这一点?我真的不敢相信这是可以做到的最好的。
谢谢
【问题讨论】:
-
欢迎您!这不是适合堆栈溢出的实际问题。对于代码审查,请使用适当的位置codereview.stackexchange
-
不,这不是最好的。尝试使用
_mm256_cmp_ps在一条指令中执行 8 次比较。 (下限需要一个,上限需要一个)
标签: c++ sse intrinsics avx