2011-08-11 22 views
6

我正在研究一个算法,可以做很多次相同的操作。由于该操作由一些线性代数(BLAS)组成,因此我将尝试使用GPU进行此操作。opencl命令队列如何工作,我可以问些什么

我写了我的内核,并开始在命令队列上推送内核。由于每次打电话后我都不想等待,我想我会试着用事件串联我的电话,然后开始在队列中推送这些电话。

call kernel1(return event1) 
call kernel2(wait for event 1, return event 2) 
... 
call kernel1000000(vait for event 999999) 

现在的问题是,是否所有这一切被推到做驱动程序存储区的队列图形芯片?它对我可以使用的事件的数量或者命令队列的长度有一个限制,我查看过但我一直无法找到它。

我正在使用atMonitor来检查我的GPU的利用率,并且很难将它推到20%以上,这可能是因为我无法以足够快的速度将呼叫推出去吗?我的数据已经存储在GPU上,我传递的所有内容都是实际的通话。

回答

4

首先,除非下一个内核对前一个内核具有数据依赖性,否则不应该等待先前内核的事件。设备利用率(通常)取决于队列中总是有一些准备就绪的东西。只有在需要等待事件时才等待事件。

“是否所有这些都被推送到驱动程序存储队列的图形芯片?”

这是实现定义的。请记住,OpenCL不仅仅在GPU上工作!就CUDA风格的设备/主机二分法而言,您应该在“主机”上考虑命令队列操作(对于大多数实现)。

尝试排队多个内核调用,而不用等待它们之间的等待。另外,请确保您使用的是最佳工作组大小。如果你这样做,你应该能够最大化你的设备。

1

不幸的是,我不知道所有问题的答案,你也让我现在也想知道同样的事情,但我可以说我怀疑OpenCL队列将会变得完整,因为你的GPU应该完成执行提交至少20条命令之前的最后一个排队命令。这只是如果你的GPU有一个“看门狗”,因为这会阻止可执行的长内核(我认为5秒或更长)的荒谬可笑。

+0

好的,你能告诉我你从哪里知道吗?我试图找出opencl的实际规格,但它并不容易(我正在考虑切换到CUDA)。 你说什么,驱动程序捆绑的命令,并将它们发送到大块的GPU? –

+1

我认为驱动程序根据OpenCL文档clFinish块自动捆绑命令,直到传入的命令队列中的所有命令都已完成执行,因此除非您调用clFinish OpenCL将决定何时执行命令。然而,呼叫clFinish是昂贵的,应该避免,但我仍然会尝试。您是否认为您的GPU可能足够快以执行您的计算,而不需要100%的功率?我唯一能想到的另一件事是OpenCL限制了GPU的使用,所以你的电脑显示屏不会锁定 –

相关问题