我很好奇GPU如何多次执行同一个内核。
我有一个内核,它被连续排队数百次(可能是数千次),使用AMD App Profiler,我注意到它执行内核集群的速度非常快,然后就像钟表一样,内核偶尔会“挂起”(即执行时间延长了几个数量级)。我认为每64个内核都会挂起。
这很奇怪,因为每次通过内核都会以相同的局部和全局大小执行完全相同的操作。我甚至重新使用了相同的缓冲区。
我是否遗漏了一些关于执行模型的东西(可能是访问GPU的其他程序/操作系统或GPU内存的定时频率)。我在Windows7(64位)下的ATISDK卡上进行了测试,使用的是HD5650 App SDK2.5,支持有序队列执行。
顺便说一句,如果我的内核中没有任何全局内存访问(这是一个相当不切实际的前景),分析器会在快速执行的内核和执行缓慢的内核之间设置一个空隙,现在是一个很大的空隙,没有一个内核正在执行。
作为后续问题,有什么可以解决这个问题的吗?
发布于 2011-12-08 15:14:19
很可能你看到了GPU的最大并发任务数的影响。排队的每个任务被分配给一个或多个多处理器,这些多处理器通常能够一次运行数百个工作项目-属于同一内核,在同一调用中排队。也许您看到的是OpenCL运行时在等待其中一个多处理器被释放。这与占用问题最直接相关-如果工作大小不能使多处理器保持忙碌,那么通过内存延迟和所有其他因素,它就会有空闲周期。这里的限制取决于内核需要多少寄存器(本地或私有内存)。总而言之,您希望编写内核来操作多个数据片段,而不是将其多次排队。
您的测量是否包括读回明显快速执行的结果?
https://stackoverflow.com/questions/8404411
复制相似问题