【问题标题】:How to compile one specific class with SSE如何使用 SSE 编译一个特定的类
【发布时间】:2015-01-23 08:53:00
【问题描述】:

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

我希望编译器只对这个类使用 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 优化并禁用其余代码的情况下编译此类?

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

我的班级是这样的:

#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]);
}

【问题讨论】:

  • 我认为您需要每个文件的编译器标志。见stackoverflow.com/questions/7447836/…
  • 感谢您的链接。我认为这是正确的方法,但不幸的是我没有成功......
  • 您可能应该包含&lt;immintrin.h&gt;,然后让编译器完成剩下的工作。
  • 最近的 gcc 不应该抱怨标头(并且您不需要在 #include 之前添加 #pragma)。

标签: c++ gcc sse


【解决方案1】:

我不了解 Android 工具链,但在桌面上我会将该类编译到单独的目标文件中,并将其与其余代码链接。

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

【讨论】:

  • 虽然它不完全符合我的问题,但我认为如果您必须使用 4.9 之前的 GCC 版本,这是正确的方法。
【解决方案2】:

所以我尝试了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]);
}

&lt;nmmintrin.h&gt; 的包含不再需要,但我必须添加目标属性才能编译它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多