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

时间:2013-01-01 20:05:18

标签: compiler-construction parameters cuda gpu nvcc

我有一个简单的CUDA内核,用于计算1000字节片段中A的数量 一个非常大的字符串。布局数据库以便进行内存访问 聚结。从内核返回后,我的main函数复制了设备 数组results到主机上的一个进行进一步分析。

__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;
}

内核运行正常。但是,如果我用一些微不足道的东西替换results[id]=A results[id]=10或者只是注释掉它运行得更快(10次)和 使用--ptxas-options=-v给出的寄存器少得多。内核没有帮助 如果我注释掉那条线。 CUDA编译器是否通过查看传递来了解这一点 参数?它选择什么都不做?

1 个答案:

答案 0 :(得分:3)

您所看到的是编译器优化的结果。编译将修剪“死”代码,即不直接导致内存写入的代码。所以你的内核

__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;
}

有效优化

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

  unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
  results[id]=10;
}

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