在使用nvcc构建时,我仍然不确定如何正确指定代码生成的体系结构.我知道我的二进制文件中嵌入了机器代码和PTX代码,这可以通过控制器开关-code和-arch(或两者的结合使用-gencode)来控制.
现在,根据本除了两种编译器标志也有指定架构方法有两种:sm_XX和compute_XX,其中compute_XX指的是虚拟和sm_XX一个真正的架构.该标志-arch仅采用虚拟体系结构的标识符(例如compute_XX),而-code标志采用真实和虚拟体系结构的标识符.
该文档指出了-arch指定为其编译输入文件的虚拟体系结构.但是,此PTX代码不会自动编译为机器代码,但这是一个"预处理步骤".
现在,-code应该指定汇编和优化PTX代码的架构.
但是,不清楚哪个PTX或二进制代码将嵌入二进制文件中.例如-arch=compute_30 -code=sm_52,如果我指定,这是否意味着我的代码将首先被编译为功能级别3.0 PTX,之后将创建功能级别5.2的机器代码?什么将被嵌入?
如果我只是说明-code=sm_52会发生什么呢?只嵌入V5.2的机器代码是用V5.2 PTX代码创建的?那有什么区别-code=compute_52?
Maxwell Architecture 在 PTX 汇编中引入了一条新指令,称为 LOP3,根据NVIDIA 博客:
“在对多个输入执行复杂逻辑运算时可以保存指令。”
在GTC 2016 上,一些 CUDA 开发人员设法使用此类指令加速了Tegra X1 处理器(Maxwell)的atan2f功能。
但是,下面的函数中定义的.cu文件导致未定义的定义__SET_LT和__LOP3_0xe2。
我是否必须在.ptx文件中定义它们?如果是这样,如何?
float atan2f(const float dy, const float dx)
{
float flag, z = 0.0f;
__SET_LT(flag, fabsf(dy), fabsf(dx));
uint32_t m, t1 = 0x80000000;
float t2 = float(M_PI) / 2.0f;
__LOP3_0x2e(m, __float_as_int(dx), t1, __float_as_int(t2));
float w = flag * __int_as_float(m) + float(M_PI)/2.0f;
float Offset = copysignf(w, dy);
float t = fminf(fabsf(dx), fabsf(dy)) …Run Code Online (Sandbox Code Playgroud)