为什么CUDA GPU未报错却拒绝接受共享内存bank配置变更请求?
问题解答
关于配置被忽略的疑问
你遇到的情况是硬件架构限制导致的:GTX 1050 Ti 属于Pascal架构(计算能力6.1),从Pascal架构开始,NVIDIA就取消了共享内存bank大小的可配置权限,该架构及之后所有新架构的GPU,共享内存bank都固定为4字节,不再支持切换为8字节模式。
设置接口不返回错误是CUDA的向前兼容设计:为了保证针对Kepler、Maxwell等旧架构开发的代码能在新设备上正常运行,驱动遇到不支持的配置请求时会直接静默忽略,不会抛出错误,避免旧程序直接运行失败。
关于程序是否有BUG的疑问
你的代码没有问题:上下文绑定逻辑正确,API调用参数、错误校验都完全符合CUDA规范,运行结果不符合预期完全是硬件限制导致的,和代码本身无关。
关于混用API的疑问
这个问题和你混用Runtime API与Driver API没有关系:你代码里通过cudaSetDevice初始化的主上下文,和通过Driver API拿到的主上下文是同一个实例,你也做了断言校验确认上下文匹配,不存在上下文错配的问题。哪怕你把所有接口都换成Runtime API的cudaDeviceSetSharedMemConfig/cudaDeviceGetSharedMemConfig,运行结果也是一样的。
如果你找一块Maxwell(计算能力5.x)或者Kepler架构的老卡跑同样的代码,就能看到bank size配置可以正常生效。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

