内核调用参数可以创建或中断程序?

问题描述 投票:-2回答:1

我有一个一般的CUDA问题,因此这里没有源代码。我确实有一个粒子模拟器,正在尝试移植到GPU上。

现在我遇到了一个问题,那就是它可以正常工作,但是一旦我增加了太多的粒子数量,就会出现非法的内存访问。解决方案是通过增加两个内核调用参数,即块数和每个块的线程数。

我的问题是,这是什么意思?为什么在这里使用较大的值?如果我冒着风险,如果用户手动增加粒子数量,则程序可能会崩溃,为什么我默认不扩大参数呢?

c++ cuda gpgpu
1个回答
0
投票

[CUDA运行时API和CUDA驱动程序API是2通用GPU API已被用作程序员用来对GPU的子集行为进行“编程”的通用语言。

从个人角度来看,GPU编程比CPU编程(普通编程)复杂得多,因为它最近才出现,所以没有很多“编译器技巧”可以使一些GPU代码的编译步骤自动化。

为什么默认情况下我不应该按比例放大参数

另一个原因是,在处理CUDA时,最高优先级是性能。因此,消除一些代码复杂度通常不是什么大问题。

为什么它在这里使用较大的值?

我不确定代码是如何实现的。但是可能是这样的,线程数就是粒子数。

blocks per gridthreads per block为何变化的附加说明。

CUDA程序从GPU分配了一些资源。这里的资源可以是threadslocal memoryglobal memory

如下图所示,每个块具有多个线程,每个网格具有多个块。一个简单的问题出现了,为什么我们不将每个块的线程数设置为1。这是因为使用了local memory

Local memory类似于CPU缓存,它具有访问时间的优势。即使只有同一块中的线程也可以使用相同的local memory块。

希望有帮助。

CUDA logical architecture

© www.soinside.com 2019 - 2024. All rights reserved.