gpt4 book ai didi

c++ - 没有相应编译器标志的 Clang/GCC 编译器内部函数

转载 作者:可可西里 更新时间:2023-11-01 18:29:28 28 4
gpt4 key购买 nike

我知道有类似的问题,但是用不同的标志编译不同的文件是可接受的解决方案,因为它会很快使代码库复杂化。回答“不,不可能”即可。


是否可以在任何版本的 Clang 或 GCC 中为 SSE 2/3/3S/4.1 编译内在函数,同时只允许编译器使用 SSE 指令集进行优化?

编辑:例如,我希望编译器将 _mm_load_si128() 转换为 movdqa,但编译器绝不能发出此指令除了这个内部函数之外的其他地方,类似于 MSVC 编译器的工作方式。

EDIT2:我有动态调度程序和几个版本的单一功能,具有使用内部函数编写的不同指令集。使用多个文件会使维护变得更加困难,因为相同版本的代码将跨越多个文件,并且有很多此类函数。

EDIT3:请求的示例源代码:https://github.com/AviSynth/AviSynthPlus/blob/master/avs_core/filters/resample.cpp或该文件夹中的大多数文件。

最佳答案

这是一种使用 gcc 的方法,可能是可以接受的。所有源代码都放在一个源文件中。单个源文件被分成几个部分。其中一部分根据使用的命令行选项生成代码。 main() 和处理器特征检测等函数在本节中。另一部分根据目标覆盖编译指示生成代码。可以使用目标覆盖值支持的内部函数。只有在处理器特性检测确认所需的处理器特性存在后,才应调用本节中的函数。此示例有一个用于 AVX2 代码的覆盖部分。编写针对多个目标优化的函数时,可以使用多个覆盖部分。

// temporarily switch target so that all x64 intrinsic functions will be available
#pragma GCC push_options
#pragma GCC target ("arch=core-avx2")
#include <intrin.h>
// restore the target selection
#pragma GCC pop_options

//----------------------------------------------------------------------------
// the following functions will be compiled using default code generation
//----------------------------------------------------------------------------

int dummy1 (int a) {return a;}

//----------------------------------------------------------------------------
// the following functions will be compiled using core-avx2 code generation
// all x64 intrinc functions are available
#pragma GCC push_options
#pragma GCC target ("arch=core-avx2")
//----------------------------------------------------------------------------

static __m256i bitShiftLeft256ymm (__m256i *data, int count)
{
__m256i innerCarry, carryOut, rotate;

innerCarry = _mm256_srli_epi64 (*data, 64 - count); // carry outs in bit 0 of each qword
rotate = _mm256_permute4x64_epi64 (innerCarry, 0x93); // rotate ymm left 64 bits
innerCarry = _mm256_blend_epi32 (_mm256_setzero_si256 (), rotate, 0xFC); // clear lower qword
*data = _mm256_slli_epi64 (*data, count); // shift all qwords left
*data = _mm256_or_si256 (*data, innerCarry); // propagate carrys from low qwords
carryOut = _mm256_xor_si256 (innerCarry, rotate); // clear all except lower qword
return carryOut;
}

//----------------------------------------------------------------------------
// the following functions will be compiled using default code generation
#pragma GCC pop_options
//----------------------------------------------------------------------------

int main (void)
{
return 0;
}

//----------------------------------------------------------------------------

关于c++ - 没有相应编译器标志的 Clang/GCC 编译器内部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21363456/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com