我正在开发应该在几个具有不同内存和计算能力的CUDA GPU上运行的软件 . 我不止一次地想到客户会在GPU上报告一个我无法在我的机器上重现的可重现问题 . 也许是因为我有8 GB的GPU内存并且它们有4 GB,可能是因为计算能力3.0而不是2.0,这样的事情 .
因此问题是:我可以暂时“降级”我的GPU,以便它假装是一个较小的模型,具有较少的内存和/或较低的计算能力?
每条评论澄清我在问什么 .
假设客户报告在具有计算能力的GPU上运行的问题 C
,其中每个块具有 M
的GPU内存和 T
个线程 . 我的机器上有更好的GPU,具有更高的计算能力,更多的内存和更多的每个块的线程 .
1)我可以在我的GPU上运行我的程序仅限于GPU内存的演出吗?这个问题的答案似乎是“是的,只是分配(无论你有什么记忆) - 启动时 M
并且永远不会使用它;只有在你的程序退出之前才会留下_2536609 . ”
2)在运行时间内,我可以将GPU上块的大小减小到不超过 T
个线程吗?
3)我可以在运行期间降低GPU的计算能力,如我的程序所示?
1 回答
我原本想把它作为评论,但它对于那个范围来说太大了 .
正如@RobertCrovella所说,没有本地方式可以满足您的要求 . 也就是说,您可以采取以下措施来最小化您在其他体系结构上看到的错误 .
0)尝试从要定位的CUDA GPU获取
cudaGetDeviceProperties
的输出 . 您可以从您的用户或社区群众中获取此信息 .1)要限制内存,您可以实现内存管理器并手动跟踪正在使用的内存,或使用
cudaGetMemInfo
获得相当接近的估计值 . 注意:此函数也返回其他应用程序使用的内存 .2)使用包装器宏来启动内核,您可以在其中显式检查块/线程的数量是否适合当前配置文件 . 即而不是发射
你会做这样的事情:
在哪里可以像这样定义宏:
3)不可能降低计算能力,但是你可以使用各种计算模式来编写代码,并确保你的内核中包含向后兼容的代码 . 如果您的内核的某个部分错误地使用较旧的计算模式,您可以执行以下操作:
每当要测试回退代码并确保代码适用于较旧的计算时,您可以定义
TEST_FALLBACK
.