2010-12-19 83 views
11

假设我有一个数组:索引与SSE阵列

uint8_t arr[256]; 

和元件包含16个字节,

x_1, x_2, ... x_16 

我想有效地填充一个

__m128i x 

__m128i元件

__m128i y 

与来自arr取决于值x值,使得:

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

的命令来实现,这将基本上可以从一个非连续组存储器位置加载的寄存器。我对看到这样一个命令的文档有一个痛苦的模糊记忆,但现在找不到它。它存在吗?在此先感谢您的帮助。

+0

修复了代码格式化;在将来,请记住,如果要将文本块格式化为代码,则必须用4个空格将其缩进,并在其之前保留一个空行(或者只需选中它并按'0101'按钮)即可。 – 2010-12-19 16:24:34

+1

@Matteo:它不再是'101010'。它变成了'{}'... – thkala 2010-12-19 16:51:21

+0

@thkala:呃,我没有注意到,一般我只是做CTRL-K或从我的编辑器复制粘贴,我可以添加4个空格按TAB(我可以受益于语法突出显示)。 – 2010-12-19 16:58:09

回答

6

SIMD体系结构中的这种功能称为加载/存储分散/聚集。不幸的是,SSE没有它。来自英特尔的未来SIMD架构可能会有这种 - 命运多ill的Larrabee处理器就是一个例子。现在,虽然您只需要设计数据结构,但不需要这种功能。

请注意,您可以通过使用例如_mm_set_epi8:

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

尽管这当然会产生一堆标量代码来加载你的y向量。如果你在任何性能关键的循环之外进行这种操作,这很好,例如,作为循环之前的初始化的一部分,但是在循环内部,它很可能是性能杀手。

+0

感谢您的回答。 “聚集/散布”显然是我期待的术语。经过简短的检查,看起来像这样的功能在GPU上可用。有关这些方面的建议? – Travis 2010-12-19 22:56:45

+0

即使在GPU上,这也可能是效率低下的,因为从不同的存储器地址加载/存储将不可避免地意味着更多的总线周期。 – 2010-12-20 00:15:42