我有一个Numba cuda内核,在RTX 3090上可以启动多达640个线程和64个块
如果我尝试使用641个线程,它将失败:
Traceback (most recent call last):
File "/home/stark/Work/mmr6/mmr/algos/company_analysis/_analysis_gpu_backup.py", line 905, in <module>
load()
File "/home/stark/Work/mmr6/mmr/algos/company_analysis/_analysis_gpu_backup.py", line 803, in load_markets
run_simulations[algo_configs.BLOCK_COUNT, algo_configs.THREAD_COUNT, stream](
File "/home/stark/anaconda3/envs/mmr-env/lib/python3.9/site-packages/numba/cuda/compiler.py", line 821, in __call__
return self.dispatcher.call(args, self.griddim, self.blockdim,
File "/home/stark/anaconda3/envs/mmr-env/lib/python3.9/site-packages/numba/cuda/compiler.py", line 966, in call
kernel.launch(args, griddim, blockdim, stream, sharedmem)
File "/home/stark/anaconda3/envs/mmr-env/lib/python3.9/site-packages/numba/cuda/compiler.py", line 693, in launch
driver.launch_kernel(cufunc.handle,
File "/home/stark/anaconda3/envs/mmr-env/lib/python3.9/site-packages/numba/cuda/cudadrv/driver.py", line 2094, in launch_kernel
driver.cuLaunchKernel(cufunc_handle,
File "/home/stark/anaconda3/envs/mmr-env/lib/python3.9/site-packages/numba/cuda/cudadrv/driver.py", line 300, in safe_cuda_api_call
self._check_error(fname, retcode)
File "/home/stark/anaconda3/envs/mmr-env/lib/python3.9/site-packages/numba/cuda/cudadrv/driver.py", line 335, in _check_error
raise CudaAPIError(retcode, msg)
numba.cuda.cudadrv.driver.CudaAPIError: [701] Call to cuLaunchKernel results in CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES
但当我查看nvidia smi时,我发现运行640个线程只需要2.9GB内存。此GPU有22GB未使用的内存
在这种情况下还有什么问题?我在某处读到,网格大小、块大小、寄存器使用和共享内存使用是需要考虑的因素。我怎样才能知道我使用了多少寄存器和共享内存
通常是每个线程的寄存器问题(
CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES
)。这在这里的SOcuda
标记(如this one)上的许多问题中都有涉及。还有许多其他的,如here。简而言之,每个线程块使用的寄存器总数不能超过GPU的限制(见下文)。每个数据块使用的寄存器总数大约是每个线程的寄存器总数乘以每个块的线程数(可能是分配粒度的四舍五入)在numba cuda中解决此问题的主要方法是在
cuda.jit
装饰器中包含一个maximum register usage parameter:当然,您可以将其设置为其他值。一个简单的启发式方法是将每个SM的寄存器总数(或更低的每个thead块)(可通过CUDA
deviceQuery
示例代码或表15中的the programming guide发现)除以您希望启动的每个块的线程总数。因此,如果您的GPU SM有64K寄存器,并且您希望每个块启动1024个线程,那么您可以选择每个线程最多64个寄存器。这个数字应该适用于RTX 3090相关问题 更多 >
编程相关推荐