为什么启动Numba cuda内核最多可以使用640个线程,但在有大量GPU可用内存的情况下,无法使用641?

2024-06-16 11:26:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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未使用的内存

在这种情况下还有什么问题?我在某处读到,网格大小、块大小、寄存器使用和共享内存使用是需要考虑的因素。我怎样才能知道我使用了多少寄存器和共享内存


Tags: inpyenvhomelibpackageslinesite
1条回答
网友
1楼 · 发布于 2024-06-16 11:26:32

通常是每个线程的寄存器问题(CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES)。这在这里的SOcuda标记(如this one)上的许多问题中都有涉及。还有许多其他的,如here。简而言之,每个线程块使用的寄存器总数不能超过GPU的限制(见下文)。每个数据块使用的寄存器总数大约是每个线程的寄存器总数乘以每个块的线程数(可能是分配粒度的四舍五入)

在numba cuda中解决此问题的主要方法是在cuda.jit装饰器中包含一个maximum register usage parameter

@cuda.jit( max_registers=40) 

当然,您可以将其设置为其他值。一个简单的启发式方法是将每个SM的寄存器总数(或更低的每个thead块)(可通过CUDAdeviceQuery示例代码或表15中的the programming guide发现)除以您希望启动的每个块的线程总数。因此,如果您的GPU SM有64K寄存器,并且您希望每个块启动1024个线程,那么您可以选择每个线程最多64个寄存器。这个数字应该适用于RTX 3090

相关问题 更多 >