我在 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++编写代码,如果可能的话,我想使用类似内在函数的解决方案来阅读有关硬件的有用信息,我的顾虑/注意事项是:
我要回答的最后一个问题是:如何用内在函数做类似的事情?因为我没有找到除CPUID操作码以外的任何东西来获取这种信息.
哪个逻辑处理器属于 P 核心组,哪个属于 E 核心组?
我的第一个想法是检查每个逻辑处理器的基本时钟,然后假设最低的基本时钟属于 E 核(根据英特尔规范,E 核的基本时钟总是明显低于 P 核)。
我希望HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor
在注册表中进行检查就足够了。不幸的~MHz
是始终包含 P 核的基本时钟。
测试是否定义了预处理器符号的常用方法是使用#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
一组硬编码符号。如果要事先知道要检查的符号集,显然很容易。