Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用SSE索引到数组中_C_Sse_Simd - Fatal编程技术网

C 使用SSE索引到数组中

C 使用SSE索引到数组中,c,sse,simd,C,Sse,Simd,假设我有一个数组: uint8_t arr[256]; 和一个元素 __m128i x 包含16个字节 x_1, x_2, ... x_16 我想高效地填充一个新的\uuu m128i元素 __m128i y 根据x中的值,使用arr中的值,以便: y_1 = arr[x_1] y_2 = arr[x_2] . . . y_16 = arr[x_16] 实现这一点的命令实质上是从一组非连续的内存位置加载寄存器。我有一个痛苦的模糊记忆,曾经看过这样一个命令的文档,但

假设我有一个数组:

uint8_t arr[256];
和一个元素

__m128i x
包含16个字节

x_1, x_2, ... x_16
我想高效地填充一个新的
\uuu m128i
元素

__m128i y
根据
x
中的值,使用
arr
中的值,以便:

y_1  = arr[x_1]
y_2  = arr[x_2]
   .
   .
   .
y_16 = arr[x_16]

实现这一点的命令实质上是从一组非连续的内存位置加载寄存器。我有一个痛苦的模糊记忆,曾经看过这样一个命令的文档,但现在找不到。它存在吗?提前感谢您的帮助。

SIMD体系结构中的这种功能称为加载/存储分散/聚集。不幸的是,苏格兰和南方能源公司没有。英特尔未来的SIMD架构可能会有这种情况——命运多舛的Larrabee处理器就是一个很好的例子。现在,您只需要以一种不需要这种功能的方式来设计数据结构

请注意,您可以通过使用例如_mm_set_epi8来实现等效效果:

y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]);

当然,这只会生成一堆标量代码来加载y向量。如果您在任何性能关键循环之外执行此类操作,例如在循环之前作为初始化的一部分,但在循环内部它可能是性能杀手,则这是可以接受的。

修复了代码格式;今后,请记住,如果要将文本块格式化为代码,您必须将其缩进4个空格,并在其前面留下一个空行(或者只需选择它并按下
0101
按钮)。@Matteo:它不再是
101010
。它改为
{}
..@thkala:嗯,我没有注意到,一般来说,我只是在我的编辑器中执行CTRL-K或复制粘贴,在那里我可以按TAB键添加4个空格(并且我可以从语法高亮显示中受益)。谢谢你的回答。“聚集/分散”显然是我一直在寻找的术语。经过简短的检查,看起来GPU上有这样的功能。有什么建议吗?即使在GPU上,这也可能是低效的,因为从不同的内存地址加载/存储将不可避免地意味着更多的总线周期。
\u mm\u set\u epi8
允许您执行加载(一些手动放弃)到
\u m128i
。如何从
\uuu m128i
到数组元素进行类似的存储?@jww:使用SSE进行分散存储没有方便或有效的方法-我可能只使用并集和循环来执行存储。