如何计算整个CUDA内核执行的线程数?

如何计算整个CUDA内核执行的线程数?,cuda,Cuda,我想在整个内核执行过程中逐渐计算线程执行的数量。是否有本机计数器用于此操作,或者是否有其他方法用于此操作?我知道每个线程保留一个全局变量和增量是行不通的,因为全局内存中的变量不能保证线程同步访问。可能是这样的: __global__ void mykernel(int *current_thread_count, ...){ atomicAdd(current_thread_count, 1); // the rest of your kernel code } int main

我想在整个内核执行过程中逐渐计算线程执行的数量。是否有本机计数器用于此操作,或者是否有其他方法用于此操作?我知道每个线程保留一个全局变量和增量是行不通的,因为全局内存中的变量不能保证线程同步访问。

可能是这样的:

__global__ void mykernel(int *current_thread_count, ...){
  atomicAdd(current_thread_count, 1);
  // the rest of your kernel code
  }


int main() {
  int tally, *dev_tally;
  cudaMalloc((void **)&dev_tally, sizeof(int));
  tally = 0;
  cudaMemcpy(dev_tally, &tally, sizeof(int), cudaMemcpyHostToDevice);
  ....
  // set up block and grid dimensions, etc.
  dim3 grid(...);
  dim3 block(...)

  mykernel<<<grid, block>>>(dev_tally, ...);
  cudaMemcpy(&tally, dev_tally, sizeof(int), cudaMemcpyDeviceToHost); 
  printf("total number of threads that executed was: %d\n", tally);
  ....

  return 0;
  }
\uuuuu全局\uuuuuu无效mykernel(int*当前线程计数,…){
atomicAdd(当前线程计数,1);
//内核代码的其余部分
}
int main(){
int tally,*dev_tally;
cudamaloc((void**)和dev_-tally,sizeof(int));
理货=0;
cudaMemcpy(开发计数和计数、大小(int)、cudamemcpyhostodevice);
....
//设置块和网格尺寸等。
dim3网格(…);
dim3块(…)
mykernel(dev_-taly,…);
cudaMemcpy(&tally、dev_tally、sizeof(int)、cudamemcpydevicetoost);
printf(“执行的线程总数为:%d\n”,计数);
....
返回0;
}
你可以阅读更多关于原子函数的内容


许多人在评论中表示困惑的部分原因是当
mykernel
完成时(假设它成功运行)每个人都希望
tall
的值最终等于
grid.x*grid.y*grid.z*block.x*block.y*block.z

衡量线程级执行效率的方法很多。此答案提供了不同收集机制的列表。Robert Crovella的回答提供了一种手动检测方法,允许准确收集信息。类似的技术可用于在内核中收集发散信息

为执行而启动的线程数(静态)

gridDim.x*gridDim.y*gridDim.z*blockDim.x*blockDim.y*blockDim.z

启动的线程数

gridDim.x*gridDim.y*gridDim.z*取整((blockDim.x*blockDim.y*blockDim.z),扭曲大小)

此数字包括在经纱寿命期内处于非活动状态的线程

这可以使用启动的PM计数器线程收集

执行的扭曲指令

计数器inst_executed统计执行/失效的warp指令数

发出的扭曲指令

发出的计数器inst_统计发出的指令数。已发布指令>=已执行指令。某些指令将在每个执行的指令中多次发出,以处理对窄执行单元的分派,或处理共享内存和L1操作中的地址分歧

执行的线程指令

计数器thread inst executed统计执行的线程指令数。可以使用thread_inst_executed/inst_executed导出每个指令的平均线程数。此计数器的最大值为扭曲大小

执行的非谓词线程外指令

Compute capability 2.0及更高版本的设备使用指令预测来禁用warp中线程的回写,作为对发散指令短序列的性能优化

计数器not_predicated_off_thread_inst_executed统计所有线程执行的指令数。此计数器仅在compute capability 3.0及以上设备上可用


非谓词线程执行我认为没有办法计算特定路径分支中的线程数。对于直方图的ex,最好有以下内容:

PS:直方图是关于计算每种颜色的像素数


for(i=0;i您是指内核使用的线程数吗?我认为这是编译时参数……您所说的“线程执行数”是什么意思?对于整个内核执行,任何线程是如何执行的。例如,如果5个线程有2个块处于活动状态,每个块的执行次数是预期的20次。明白了吗?我不能给出一个示例,因为我不清楚您到底想知道什么(以及为什么您认为您想知道它)。请提供更多详细信息。您的问题与您刚才提出的问题有什么不同,您自己给出了一个微不足道的答案?@GregSmith提供了一个更好的答案。感谢您提供了一个很好的答案。我有时想知道为什么CUDA探查器不提供根本无法运行扭曲的非周期数(即。“
发出的指令0
”类似于
发出的指令1
发出的指令2
)这是优化中最有趣的事件之一,可能就是Erogol所追求的。
sm_效率
包含类似的信息,但由于它似乎是从不同运行中采样的事件中派生出来的,因此很容易被关闭10%左右。@tera我将为CUPTI/nvprof/VisualProfiler中的计数器添加RFE。Nsight VSE支持“PM计数器-费米/开普勒”原始计数器实验中的计数器。周期百分比(指令发出0个/活动周期)也显示在问题效率实验饼图中。谢谢Greg!最后是使用Windows的原因。;)非常感谢RFE将其带到UnixOIDE。