在将cmath和amd数学库链接到c++时,观察到amd数学库替换了cmath中的所有函数。
在使用GDB进行调试时,发现以下输出证明了上述语句。commandline output from Gdb
附加用于检查上述语句的代码段。
#include "amdlibm.h"
#include "math.h"
namespace amdfunc {
void sqrttest() {
printf("Calling amd func\n");
double val = 22.34;
double val1;
double val2;
for (int i = 0; i < 5000000000; i++) {
val1 = amd_sqrt(val);
}
}
}
namespace normalfunc {
void sqrttest() {
printf("Calling cmath func\n");
double val = 22.34;
double val1;
double val2;
for (int i = 0; i < 5000000000; i++) {
val1 = sqrt(val);
}
}
}
int main() {
normalfunc::sqrttest();
amdfunc::sqrttest();
}
命令行:使用以下命令链接库并编译代码。
g++ test.cpp -g -o testinglib -L/usr/lib/x86_64-linux-gnu -L/usr/lib -I/usr/include -I/home/test/include -Wl,-rpath,/home/test/lib /home/test/lib/libalm.so -lm
我们在编译时重新排序库,观察到相同的错误。附加amd数学库链接,我们从该链接使用文件https://www.amd.com/en/developer/aocl/libm.html
编译并运行可执行文件
1条答案
按热度按时间stszievb1#
这是故意的行为
AOCL-LibM是一个C库,你可以链接到你的应用程序来替换编译器提供的数学函数。
文件第67页
https://www.amd.com/content/dam/amd/en/documents/pdfs/developer/aocl/aocl-v4.0-ga-user-guide.pdf