【问题标题】:Running each kernel function on multiple gpus in cuda 10.0在 cuda 10.0 中的多个 gpus 上运行每个内核函数
【发布时间】:2020-06-01 02:05:27
【问题描述】:
// Four Kernel Runs Simultaneously
Kernel1 <<< numBlocks, threadPerBlock >>> (args); // GPU 0
Kernel2 <<< numBlocks, threadPerBlock >>> (args); // GPU 1
Kernel3 <<< numBlocks, threadPerBlock >>> (args); // GPU 2
Kernel4 <<< numBlocks, threadPerBlock >>> (args); // GPU 3

我希望它像这段代码一样工作。

您有任何样品或文件可供参考吗?

【问题讨论】:

    标签: cuda gpu


    【解决方案1】:

    您可以在每次内核调用之前使用cudaSetDevice(int device)

    __host__ ​cudaError_t cudaSetDevice ( int device ) 设置用于 GPU 执行的设备。

    // Four Kernel Runs Simultaneously
    cudaSetDevice(0);
    Kernel1 <<< numBlocks, threadPerBlock >>> (args); // GPU 0
    cudaSetDevice(1);
    Kernel2 <<< numBlocks, threadPerBlock >>> (args); // GPU 1
    cudaSetDevice(2);
    Kernel3 <<< numBlocks, threadPerBlock >>> (args); // GPU 2
    cudaSetDevice(3);
    Kernel4 <<< numBlocks, threadPerBlock >>> (args); // GPU 3
    

    【讨论】:

    • 仅仅这样做并不能保证一切正常。您确实需要在每台设备上创建一个流并将狗窝启动到该流中
    • 是否同时保证?它可能会连续工作。
    • 要同时运行它,您需要创建自定义流并使用流运行内核。
    • 实际上这就是所有需要的,以允许在不同设备上运行的内核重叠。默认流就足够了,因为流是每个设备的构造,并且流语义表明启动到单独流中的内核可能会重叠。默认流语义(即同步)在这里不适用,因为它们只同步 per-device 的活动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多