AVX不比SSE快?

时间:2015-09-20 03:17:00

标签: c assembly x86 sse avx

我有大块数据需要计算:

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)的强大功能?

0 个答案:

没有答案