相关疑难解决方法(0)

CUDA:如何使用-arch和-code以及SM vs COMPUTE

在使用nvcc构建时,我仍然不确定如何正确指定代码生成的体系结构.我知道我的二进制文件中嵌入了机器代码和PTX代码,这可以通过控制器开关-code-arch(或两者的结合使用-gencode)来控制.

现在,根据除了两种编译器标志也有指定架构方法有两种:sm_XXcompute_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

cuda nvcc fat-binaries ptx

32
推荐指数
1
解决办法
2万
查看次数

如何为 Maxwell 及更高版本的 NVIDIA 架构编写基于 LOP3 的指令?

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)

cuda nvidia

2
推荐指数
1
解决办法
1887
查看次数

标签 统计

cuda ×2

fat-binaries ×1

nvcc ×1

nvidia ×1

ptx ×1