首页 文章

将GPU降级为具有较低功能和内存的模型以进行测试

提问于
浏览
1

我正在开发应该在几个具有不同内存和计算能力的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 回答

  • 3

    我原本想把它作为评论,但它对于那个范围来说太大了 .

    正如@RobertCrovella所说,没有本地方式可以满足您的要求 . 也就是说,您可以采取以下措施来最小化您在其他体系结构上看到的错误 .

    0)尝试从要定位的CUDA GPU获取 cudaGetDeviceProperties 的输出 . 您可以从您的用户或社区群众中获取此信息 .

    1)要限制内存,您可以实现内存管理器并手动跟踪正在使用的内存,或使用 cudaGetMemInfo 获得相当接近的估计值 . 注意:此函数也返回其他应用程序使用的内存 .

    2)使用包装器宏来启动内核,您可以在其中显式检查块/线程的数量是否适合当前配置文件 . 即而不是发射

    kernel<float><<<blocks, threads>>>(a, b, c);
    

    你会做这样的事情:

    LAUNCH_KERNEL((kernel<float>), blocks, threads, a, b, c);
    

    在哪里可以像这样定义宏:

    #define LAUNCH_KERNEL(kernel, blocks, threads, ...)\
            check_blocks(blocks);\
            check_threads(threads);\
            kernel<<<blocks, threads>>>(__VA_ARGS__)
    

    3)不可能降低计算能力,但是你可以使用各种计算模式来编写代码,并确保你的内核中包含向后兼容的代码 . 如果您的内核的某个部分错误地使用较旧的计算模式,您可以执行以下操作:

    #if !defined(TEST_FALLBACK) && __CUDA_ARCH__ >= 300 // Or any other newer compute
    // Implement using new fancy feature
    #else
    // Implement a fallback version
    #endif
    

    每当要测试回退代码并确保代码适用于较旧的计算时,您可以定义 TEST_FALLBACK .

相关问题