Cuda内核配置

Cuda内核配置,cuda,gpu,Cuda,Gpu,我正在编写一个cuda c代码来处理图片,例如,我创建了一个交换函数(矩阵的交换块),但它不起作用,每次当我在内核中吃午餐时,我发现块的数量和线程的数量都有问题 例如,如果我使用 threadsPerBlock.x=threadsPerBlock.y=64和numBlocks.x=numBlocks.y=2048/threadsPerBlock.x 然后,swap(…)工作正常 但是如果我拍摄的图像大小为2560*2160,threadsPerBlock.x=threadsPerBlock.y=

我正在编写一个cuda c代码来处理图片,例如,我创建了一个交换函数(矩阵的交换块),但它不起作用,每次当我在内核中吃午餐时,我发现块的数量和线程的数量都有问题

例如,如果我使用

threadsPerBlock.x=threadsPerBlock.y=64
numBlocks.x=numBlocks.y=2048/threadsPerBlock.x

然后,
swap(…)
工作正常

但是如果我拍摄的图像大小为2560*2160,
threadsPerBlock.x=threadsPerBlock.y=64
numBlocks.x=2560/64
numBlocks.y=2160/64+1
,我有一个错误9希望是错误无效的配置参数

我使用的是CUDA 7.5和一个计算能力为5.0的GPU,设备是1024。问题的根源在于内核启动中的参数被颠倒了。当映像的最大尺寸小于2048时,这将为您提供每个块少于1024个线程的启动。大于2048且块大小变为非法

如果您这样做:

threadsPerBlock.x=threadsPerBlock.y=32
numBlocks.x=numBlocks.y=2048/threadsPerBlock.x
swap<<<numBlocks,threadsPerBlock>>>(...)
threadsPerBlock.x=threadsPerBlock.y=32
numBlocks.x=numBlocks.y=2048/threadsPerBlock.x
互换(…)
您应该发现内核启动无条件工作。

设备为1024。问题的根源在于内核启动中的参数被颠倒了。当映像的最大尺寸小于2048时,这将为您提供每个块少于1024个线程的启动。大于2048且块大小变为非法

如果您这样做:

threadsPerBlock.x=threadsPerBlock.y=32
numBlocks.x=numBlocks.y=2048/threadsPerBlock.x
swap<<<numBlocks,threadsPerBlock>>>(...)
threadsPerBlock.x=threadsPerBlock.y=32
numBlocks.x=numBlocks.y=2048/threadsPerBlock.x
互换(…)

您应该会发现内核启动是无条件工作的。

是的,我有compute 5.0,但我有线程块的最大尺寸(x,y,z):(1024,1024,64)我用的是2Dim这个问题我忘了用munchen它适用于2560*2160的大小和256*256的块大小一开始我可能是我通过了块的数量,但事实并非如此。@SalahEddine:你误解了块大小的限制。(重新)阅读我答案中的链接。最大块尺寸为(10241024,64),但每个块的线程总数必须小于或等于1024,即只有
dim.x*dim.y*dim.z Thnx的块才是我的问题:是的,我有一个计算5.0,但我有一个线程块的最大尺寸(x,y,z):(1024,1024,64)我用的是2Dim这个问题我忘了用munchen它适用于2560*2160的大小和256*256的块大小一开始我可能是我通过了块的数量,但事实并非如此。@SalahEddine:你误解了块大小的限制。(重新)阅读我答案中的链接。最大块尺寸为(10241024,64),但每个块的线程总数必须小于或等于1024,即只有
dim.x*dim.y*dim.z Thnx的块才是我的问题:)