如何用 SSE 编译一个特定的 class

How to compile one specific class with SSE

我有两个 classes 做同样的事情,但一个使用 SSE4.2 而另一个不使用。我已经在检测代码是否在支持 SSE4.2 的 CPU 上运行并使用相应的 class,但我正在努力编译 SSE4.2 class.

我希望编译器仅针对此 class 使用 SSE4.2 优化,而不针对其余代码,因此我无法使用 -msse4.2.

我读到了 #pragma GCC target("sse4.2"),但我在包含的 SSE4.2-Header 中仍然遇到编译错误:

nmmintrin.h:31:3: error: #error "SSE4.2 instruction set not enabled"

如何在启用 SSE4.2 优化并禁用其余代码的情况下编译此 class?

我正在使用 GCC 4.8 和 Android NDK 10d。

我的 class 看起来像这样:

#include "MyClassWithSSE42.h"

#pragma GCC target("sse4.2")
#include <nmmintrin.h>

uint32_t MyClassWithSSE42::CRC32byte(const uint32_t *p, const uint32_t startValue)
{
    uint32_t c = _mm_crc32_u32(startValue, p[0]);
    c = _mm_crc32_u32(c, p[1]);
    c = _mm_crc32_u32(c, p[2]);
    c = _mm_crc32_u32(c, p[3]);
    c = _mm_crc32_u32(c, p[4]);
    c = _mm_crc32_u32(c, p[5]);
    c = _mm_crc32_u32(c, p[6]);
    return _mm_crc32_u32(c, p[7]);
}

我不知道 Android 工具链,但在桌面上我会在单独的目标文件中编译 class,然后 link 它与其余代码一起编译.

g++ -msse4.2 -c MyClassWithSSE42.c++ -o MyClassWithSSE42.o # Compile only
g++ your_other_files.c++ MyClassWithSSE42.o                # Compile and link

所以我尝试了 GCC 4.9,就像 Marc Glisse 提到的那样,我让它工作了!工作代码现在看起来像这样:

#include "MyClassWithSSE42.h"

__attribute__((target("sse4.2")))
uint32_t MyClassWithSSE42::CRC32byte(const uint32_t *p, const uint32_t startValue)
{
    uint32_t c = _mm_crc32_u32(startValue, p[0]);
    c = _mm_crc32_u32(c, p[1]);
    c = _mm_crc32_u32(c, p[2]);
    c = _mm_crc32_u32(c, p[3]);
    c = _mm_crc32_u32(c, p[4]);
    c = _mm_crc32_u32(c, p[5]);
    c = _mm_crc32_u32(c, p[6]);
    return _mm_crc32_u32(c, p[7]);
}

不再需要 <nmmintrin.h> 的包含,但我必须添加 target 属性才能编译它。