1 问题描述

cuda代码有时会报如下的错误,即非法变量,这是因为外部设置共享内存的大小是有限制的。

1
2
Error code:1
Error text:invalid argument

因为核函数对共享内存的需求是不定的为了更好的利用资源以及帮助编译器进行优化,通常会采取传递共享内存大小的方式。

1
kernelFunc<<<gridDim,blockDim,sharedmem>>>()

共享内存和一级缓存共用同一硬件存储单元。因此共享内存有最高上限,且该上限不等同于硬件上限。例如H100 L1和共享内存大小之和为256KB,而单个SM共享内存最多使用228KB,而每个block最多使用227KB,但是出于资源调度等考虑会默认限制为48KB。

2 解决

可以使用下面的函数进行设置。目前只有函数级的设置,全局级没有相关的设置。

1
cudaFuncSetAttribute( KernelFunc,  cudaFuncAttributeMaxDynamicSharedMemorySize, 128 \* 1024 // 128 KB);