【发布时间】:2017-04-09 20:40:13
【问题描述】:
我正在尝试找到一种更有效的方法来“旋转”或将 avx _m256 向量中的 32 位浮点值向右或向左移动一个位置。
这样:
a7、a6、a5、a4、a3、a2、a1、a0
变成
0、a7、a6、a5、a4、a3、a2、a1
(我不介意在我更换单元格时数据是否会丢失。)
我已经看过这个帖子:Emulating shifts on 32 bytes with AVX 但我不太明白发生了什么,也没有解释 _MM_SHUFFLE(0, 0, 3, 0) 作为输入参数的作用。
我正在尝试优化这段代码:
_mm256_store_ps(temp, array[POS(ii, jj)]);
_mm256_store_ps(left, array[POS(ii, jj-1)]);
tmp_array[POS(ii, jj)] = _mm256_set_ps(left[0], temp[7], temp[6], temp[5], temp[4], temp[3], temp[2], temp[1]);
我知道一旦换档到位,我可以使用插入来替换剩余的单元格。我觉得这会比解包到 float[8] 数组并重建更有效。
-- 我还希望能够左右移动,因为我需要在其他地方执行类似的操作。
非常感谢任何帮助!谢谢!
【问题讨论】:
-
我们称其为随机播放,因为您是在四处移动元素,而不是在元素内移动或旋转位。
-
感谢术语更正,问题已适当重命名!
-
前面的代码是什么,它填充了将要移位的内容,紧随其后的代码是什么,它将使用移位的结果?也许外部部分可以集成到优化工作中。
-
您需要这个的非 AVX2 版本吗?对于 AVX2,只需在寄存器中使用带有随机掩码的
VPERMPS。它可以进行任意的车道交叉洗牌。 -
之前唯一的后续代码是 mm256_store_ps 使用的几个浮点数组的定义。 (attribute ((aligned (32))) float temp[8], up[8], down[8], left[8], right[8];) 后面的代码挺长的,但它是一系列数学表达式。该代码执行晶格 Boltzman 流体动力学的模拟。最初它是在每个单元格的基础上执行的(每个单元格都是一个浮点数)。我通过使用 AVX 指令同时执行 8 次迭代来优化这一点。这个阶段正在转移来自相邻细胞的流量。
标签: c sse hpc intrinsics avx