CUDA动态共享内存:核属性与核调用参数的设置优先级疑问
CUDA动态共享内存设置的优先级问题
- 核心结论:
cuLaunchKernel里的sharedMemBytes参数优先级更高,它直接决定核函数调用时每个线程块实际使用的动态共享内存大小,而cuFuncSetAttribute设置的CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES只是限定了允许使用的最大值。 - 两者的作用差异:
cuFuncSetAttribute的作用是给核函数定一个“使用上限”——后续所有调用该核函数时,sharedMemBytes的值不能超过这个上限,否则会触发调用错误。cuLaunchKernel的sharedMemBytes是实际分配的大小,只要这个值不超过之前设定的上限,就会按该值分配,完全不受属性里最大值的约束(属性仅限制用量不能超标,而非强制使用最大值)。
- 实际场景示例:
- 先调用
cuFuncSetAttribute把核函数的动态共享内存上限设为16KB。 - 第一次启动核时,
sharedMemBytes设为8KB,此时每个线程块会分配8KB动态共享内存,正常运行。 - 如果某次启动核时把
sharedMemBytes设为20KB,超过了16KB的上限,这次调用就会失败并返回错误码。
- 先调用
内容的提问来源于stack exchange,提问作者msedi
相关产品推荐
相关产品推荐

