我有两个做相同事情的类,但是一个使用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]);
}
最佳答案
我不了解Android工具链,但是在台式机上,我将在单独的目标文件中编译该类,并将其与其余代码链接。
g++ -msse4.2 -c MyClassWithSSE42.c++ -o MyClassWithSSE42.o # Compile only
g++ your_other_files.c++ MyClassWithSSE42.o # Compile and link
关于c++ - 如何用SSE编译一个特定的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28106136/