【发布时间】:2017-02-12 21:50:44
【问题描述】:
这是post 的后续内容。免责声明:我做了零分析,甚至没有应用程序,这纯粹是为了让我了解更多关于矢量化的知识。
我的代码如下。我正在使用 i3 m370 的机器上使用 gcc 4.9.4 进行编译。第一个循环按照我的预期进行矢量化。但是,检查 temp 的每个元素的第二个循环不是向量化的 AFAICT,带有所有“andb”指令。我希望它可以用_mm_test_all_ones 之类的东西进行矢量化。该循环如何也可以矢量化?第二个问题,我真的希望这是一个更大循环的一部分。如果我取消注释下面的内容,则不会对任何内容进行矢量化。我怎样才能把它矢量化?
#define ARR_LENGTH 4096
#define block_size 4
typedef float afloat __attribute__ ((__aligned__(16)));
char all_equal_2(afloat *a, afloat *b){
unsigned int i, j;
char r = 1;
unsigned int temp[block_size] __attribute__((aligned(16)));
//for (i=0; i<ARR_LENGTH; i+=block_size){
for (j = 0; j < block_size; ++j) {
temp[j] = (*a) == (*b);
a++;
b++;
}
for (j=0; j<block_size; j++){
r &= temp[j];
}
/*if (r == 0){
break;
}
}*/
return r;
}
以及生成的程序集的关键部分:
.cfi_startproc
movaps (%rdi), %xmm0
cmpeqps (%rsi), %xmm0
movdqa .LC0(%rip), %xmm1
pand %xmm0, %xmm1
movaps %xmm1, -24(%rsp)
movl -24(%rsp), %eax
andl $1, %eax
andb -20(%rsp), %al
andb -16(%rsp), %al
andb -12(%rsp), %al
ret
.cfi_endproc
更新: 这个post 类似于我的第一个问题。在那个问题中,向量是一个原始指针,因此段错误是可能的,但这不是问题。因此,AFAIK 重新排序比较操作在这里是安全的,但在那里不安全。结论可能是一样的。
【问题讨论】: