Compiler construction CUDA编译器是否根据传递的参数优化内核?

Compiler construction CUDA编译器是否根据传递的参数优化内核?,compiler-construction,parameters,cuda,gpu,nvcc,Compiler Construction,Parameters,Cuda,Gpu,Nvcc,我有一个简单的CUDA内核,它计算1000字节片段中a的数量 指一根非常大的绳子。数据库的布局使内存访问更加方便 合并。从内核返回后,我的主函数复制设备 将结果排列到主机上的一个以供进一步分析 __global__ void kernel(unsigned int jobs_todo, char* database, float* results ) { unsigned int id = threadIdx.x + blockIdx.x * blockDim.x; float A =

我有一个简单的CUDA内核,它计算1000字节片段中a的数量 指一根非常大的绳子。数据库的布局使内存访问更加方便 合并。从内核返回后,我的主函数复制设备 将
结果
排列到主机上的一个以供进一步分析

__global__ void kernel(unsigned int jobs_todo, char* database, float* results ) {

  unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
  float A = 0; int i; char ch;
  if(id < jobs_todo) {
    for(i = 0; i < 1000; i += 1){
     ch = database[jobs_todo*i + id];
     if(ch == 'A') A++;
   }
  results[id] = A;
}
\uuuuu全局\uuuuuu无效内核(未签名的整型作业\u todo、char*数据库、float*结果){
无符号int-id=threadIdx.x+blockIdx.x*blockDim.x;
浮点A=0;整数i;字符ch;
如果(id
内核运行良好。但是,如果我将
results[id]=A替换为
results[id]=10
或者只注释掉它运行速度更快(10倍)且 使用更少的寄存器,如
--ptxas options=-v
所示。内核没有帮助 如果我注释掉那一行,CUDA编译器通过查看传递的
参数?因此它选择什么都不做?

您看到的是编译器优化的结果。编译器将删除“死”代码,即不会直接导致内存写入的代码。因此,您的内核

__global__ void kernel(unsigned int jobs_todo, char* database, float* results ) {

  unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
  float A = 0; int i; char ch;
  if(id < jobs_todo) {
    for(i = 0; i < 1000; i += 1){
     ch = database[jobs_todo*i + id];
     if(ch == 'A') A++;
   }
   results[id]=10;
}

显然,缩减代码的寄存器占用空间和执行时间远低于完整代码。您可以通过将代码编译到PTX并检查发出的代码来确认这一点。

您看到的是编译器优化的结果。编译将删除“死的”代码,这是不会直接导致内存写入的代码

__global__ void kernel(unsigned int jobs_todo, char* database, float* results ) {

  unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
  float A = 0; int i; char ch;
  if(id < jobs_todo) {
    for(i = 0; i < 1000; i += 1){
     ch = database[jobs_todo*i + id];
     if(ch == 'A') A++;
   }
   results[id]=10;
}

显然,缩减代码的寄存器占用空间和执行时间远低于完整代码。您可以通过将代码编译到PTX并检查发出的代码来确认这一点。

如果将代码更改为results[id]=10,编译器可以在编译时确定所有正在进行的计算都表示“死”代码,因为结果[id]中的数据不依赖于A,并且优化了计算A的代码。因此您观察到的加速。我不理解您的其他问题。一般来说,编译器只能根据编译时提供的信息进行优化。如果您将代码更改为结果[id]=10,编译器可以在编译时确定所有前面的计算表示“死”代码,因为结果中的数据[id]不依赖于A,并且优化了计算A的代码。因此,您观察到的加速。我不理解您的其他问题。一般来说,编译器只能根据编译时提供的信息进行优化。我怀疑这正在发生,但我想我会与社区进行核实。谢谢。我想知道编译器是如何进行优化的ler一直在跟踪这一点。听起来好像有点内务管理。编译器跟踪数据依赖关系。消除死代码是一个“永远”的标准优化。我怀疑发生了这种情况,但我想我会与社区核实一下。谢谢。我想知道编译器是如何跟踪这种情况的。听起来像是一个相当大的内务管理。编译器跟踪数据依赖关系。消除死代码是一个“永远”存在的标准优化。