【问题标题】:How to reduce the time cost of parallel_for in DPC++?如何降低DPC++中parallel_for的时间成本?
【发布时间】:2022-08-22 14:20:26
【问题描述】:

我在 DPC++ 中编写了以下代码来测试时间消耗。

// ignore sth for defining subdevices
cl::sycl::queue q[4] = {cl::sycl::queue{SubDevices1[0]}, cl::sycl::queue{SubDevices1[1]},
                        cl::sycl::queue{SubDevices2[0]}, cl::sycl::queue{SubDevices2[1]}};

void run(){
    for(int i = 0; i < 4; i++){
        q[i].submit([&](auto &h) {
        h.parallel_for(
            sycl::nd_range<2>(sycl::range<2>(1, 1), sycl::range<2>(1, 1)),
            [=](sycl::nd_item<2> it){
                // just empty
                }
            );
        });
    }
}

它花费了大约0.6s。

当用一个parallel_for 测试一个队列时,它花费了大约0.15s。

测试时发生了一件更连贯的事情

q[i].submit([&](auto &h) {h.memcpy(...);});

当复制的数组较小时,此命令几乎不消耗时间。

如何在run()中优化上述代码?很感谢!

  • 你想达到什么目的?运行一个空内核不会告诉你很多任何事情。您所说的数组通常会影响内核的性能,因为将内存从 CPU 传输到 GPU 的成本会影响整体性能。与较大的内存传输相比,较小的内存传输对性能的影响较小。看看一些示例代码,特别是我可以推荐看看 SYCL Academy github.com/codeplaysoftware/syclacademy

标签: c++ parallel-processing hpc sycl dpc++


【解决方案1】:

如果您在不同的设备上运行,那么所有队列将并行执行。

如果要在单个设备上运行,则需要为每个队列创建一个上下文,然后它将以并行方式执行。

context c1{};
queue q1{c1,gpu_selector()};

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2022-01-14
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2020-10-01
    相关资源
    最近更新 更多