我有大块数据需要计算:
static float source0[COUNT];
static float source1[COUNT];
static float result[COUNT]; /* result[i] = source0[i] * source1[i]; */
s0 = (size_t)source0;
s1 = (size_t)source1;
r = (size_t)result;
它们都是32字节对齐的。
相关的SSE代码:
for(i = 0; i < COUNT; i += 16)
{
__asm volatile
(
"movntdqa xmm0, [%0]\n\t"
"movntdqa xmm1, [%1]\n\t"
"mulps xmm1, xmm0\n\t"
"movntps [%2], xmm1"
: : "r"(s0 + i), "r"(s1 + i), "r"(r + i) : "xmm0", "xmm1"
);
}
相关的AVX代码:
for(i = 0; i < COUNT; i += 32)
{
__asm volatile
(
"vmovapd ymm0, [%0]\n\t"
"vmovapd ymm1, [%1]\n\t"
"vmulps ymm1, ymm1, ymm0\n\t"
"vmovntps [%2], ymm1"
: : "r"(s0 + i), "r"(s1 + i), "r"(r + i) : "ymm0", "ymm1"
);
}
结果是AVX代码使用时间总是与SSE代码几乎相同。但它们比普通的C代码快得多。 我认为主要原因是“vmodapd”不支持“NT”版本,直到AVX2扩展。这会导致d-cache污染过多。
有没有更好的方法来探索AVX(不是AVX2)的强大功能?