performance - CUDA:内核性能对占用的依赖性

标签 performance cuda

我正在使用 CUDA 在 GPU (Fermi) 上进行有限差分计算(模板计算)。当我使用 CUDA Profiler 测试我的代码时,我发现占用率为 0.333。当我命令计算并将占用率增加到 0.677 后,内核的执行时间并没有减少而是增加了。换句话说,当占用率增加 1/3 时,性能就会下降。

我的问题是:

无论占用率如何,内核的性能是否取决于计算?

最佳答案

答案是“这取决于”您的工作负载的特征以及您如何定义性能。一般来说,如果您的瓶颈是数学吞吐量,那么您通常可以接受较低的占用率(12.5%-33%),但如果您的瓶颈是内存,那么您通常需要更高的占用率(66% 或更高)。这只是一个经验法则,而不是绝对规则。大多数内核都处于中间位置,但也有异常(exception)。

占用率是指内核可以同时处于事件状态的最大线程数(受每个线程或其他资源的寄存器计数限制)除以不受其他资源限制时 GPU 可以事件的最大线程数。事件意味着线程已分配硬件资源并且可用于调度,而不是它在给定时钟周期上执行任何指令。

为线程发出指令i后,该线程的指令i+1可能无法立即运行,如果它依赖于指令<的结果em>我。如果该指令是数学指令,则结果将在几个时钟周期内可用。如果是内存加载指令,可能需要数百个周期。 GPU 不会等待,而是会从满足依赖关系的其他线程发出指令。

因此,如果您主要做数学运算,则只需要几个(GPU 术语中的几个;在 CPU 上会被认为很多)线程来隐藏数学指令的几个延迟周期,这样您就可以摆脱入住率低。但是,如果您有大量内存流量,则需要更多线程来确保其中一些线程准备好在每个周期执行,因为每个线程都花费大量时间“ sleep ”等待内存操作完成。

如果您为增加占用率而进行的算法更改也增加了每个线程上完成的工作量,并且如果您已经有足够的线程来保持 GPU 繁忙,那么这种更改只会减慢您的速度。增加占用率只会提高性能,直到您有足够的线程来保持 GPU 繁忙。

关于performance - CUDA:内核性能对占用的依赖性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6688534/

相关文章:

javascript - 模板与 templateUrl 以及样式与 styleUrls - 性能

java - 使用 V 和 java hashmap 获取 K 的 O(1) 方法?

c - 应该使用GPU?

CUDA替代__syncthreads而不是__threadfence()差异

c - 在 CUDA 中使用全局内存初始化共享内存时出错

java - 使用许多 AsyncTasks 会使我的 Android 应用程序运行得更快吗?

css - CSS 如何对网页特定区域的页面绘制时间产生显着的负面影响?

c++ - Stroustrup 第 4 章练习 6 : Improve efficiency

matlab - 如何使用 CUDA 功能阻止 Matlab 在(错误的)mex 文件执行时崩溃

c++ - 像Matlab一样在C++中分配数组?