Cuda内核配置
我正在编写一个cuda c代码来处理图片,例如,我创建了一个交换函数(矩阵的交换块),但它不起作用,每次当我在内核中吃午餐时,我发现块的数量和线程的数量都有问题 例如,如果我使用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=
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的块才是我的问题:)