相关疑难解决方法(0)

为什么与 AMD Ryzen 7 3800X 相比,在许多 256 字节数组上这个最大索引函数的性能在 Intel i3-N305 上如此缓慢?

我在 Intel i3-N305 3.8GHz 和 AMD Ryzen 7 3800X 3.9GHz PC 上运行了使用 gcc-13 ( https://godbolt.org/z/qq5WrE8qx )编译的相同二进制文件。此代码使用 VCL 库(https://github.com/vectorclass/version2):

int loop_vc_nested(const array<uint8_t, H*W> &img, const array<Vec32uc, 8> &idx) {
  int sum = 0;
  Vec32uc vMax, iMax, vCurr, iCurr;

  for (int i=0; i<H*W; i+=W) {
    iMax.load(&idx[0]);
    vMax.load(&img[i]);

    for (int j=1; j<8; j++) {
      iCurr.load(&idx[j]);
      vCurr.load(&img[i+j*32]);
      iMax = select(vCurr > vMax, iCurr, iMax);
      vMax = max(vMax, vCurr);
    }

    Vec32uc vMaxAll{horizontal_max(vMax)};
    sum += iMax[horizontal_find_first(vMax == vMaxAll)];
  }

  return sum;
}
Run Code Online (Sandbox Code Playgroud)

完整的基准源位于:https://github.com/pauljurczak/simd-benchmarks/blob/main/main-5-vcl-eve.cpp …

c++ benchmarking simd avx2 vector-class-library

28
推荐指数
1
解决办法
1393
查看次数

CPUID的内在函数如信息?

考虑到我用C++编写代码,如果可能的话,我想使用类似内在函数的解决方案来阅读有关硬件的有用信息,我的顾虑/注意事项是:

  • 我不太了解汇编,只是获得这种信息是一项相当大的投资(尽管它看起来像CPU只是翻转值和读取寄存器.)
  • asm(英特尔和AT&T)至少有两种流行的语法,所以它是碎片化的
  • 奇怪的是,Intrinsics比asm代码更受欢迎和支持
  • 并非现在雷达中的所有编译器都支持内联asm,MSVC 64位是一个; 我担心我会发现其他类似的缺陷,同时深入研究我必须使用的不同编译器的功能集.
  • 考虑到这个交易,我认为对我来说更有效率的是它可以打赌Intrinsics,它应该比任何asm代码更容易.

我要回答的最后一个问题是:如何用内在函数做类似的事情?因为我没有找到除CPUID操作码以外的任何东西来获取这种信息.

c++ intrinsics cpuid

15
推荐指数
5
解决办法
7205
查看次数

gcc的__builtin_cpu_supports检查OS支持吗?

GCC编译器提供了一组内置函数来测试某些处理器功能,例如某些指令集的可用性.但是,根据这个线程,我们也可能知道操作系统可能无法启用某些cpu功能.所以问题是:__builtin_cpu_supports内在函数还检查操作系统是否启用了某些处理器功能?

c gcc simd instruction-set intrinsics

7
推荐指数
1
解决办法
687
查看次数

如何检测Intel Alder Lake CPU中的P/E-Core?

哪个逻辑处理器属于 P 核心组,哪个属于 E 核心组?

我的第一个想法是检查每个逻辑处理器的基本时钟,然后假设最低的基本时钟属于 E 核(根据英特尔规范,E 核的基本时钟总是明显低于 P 核)。

我希望HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor在注册表中进行检查就足够了。不幸的~MHz是始终包含 P 核的基本时钟。

x86 intel cpu-cores cpuid

7
推荐指数
1
解决办法
4100
查看次数

测试是否在宏内定义了预处理器符号

测试是否定义了预处理器符号的常用方法是使用#ifdef。但是,#ifdef不能在宏中使用。我需要的是一种检查宏的参数,如果该宏的参数是已定义的预处理程序符号。

例如:

#define TRACE(x,y) if(IS_DEFINED(x)){ std::cout << y; }
Run Code Online (Sandbox Code Playgroud)

在这里,TRACE有两个参数,第一个x应该是预处理器符号的名称。如果定义了此类符号,则应打印第二个参数。IS_DEFINED我正在寻找不存在的功能/宏。

用法如下:

#undef BLA
TRACE(BLA,"abc") // "abc" won't be printed, as BLA is not defined
#define BLA 1
TRACE(BLA,"xyz") // "xyz" will be printed, as BLA is a defined symbol
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?也许一些宏魔术?当然,该解决方案应该适用于任何符号,不仅适用于符号,也适用于BLA一组硬编码符号。如果要事先知道要检查的符号集,显然很容易。

c macros c-preprocessor

4
推荐指数
4
解决办法
2253
查看次数