运行 SYCL 代码时结果不正确。在尝试并行化循环时

Posted

技术标签:

【中文标题】运行 SYCL 代码时结果不正确。在尝试并行化循环时【英文标题】:Incorrect results when runnig SYCL code. while trying to parallize loop 【发布时间】:2019-11-27 11:25:44 【问题描述】:

我是这个并行编程领域的新手。我正在尝试在 SYCL 中并行化以下串行代码。但是当我尝试运行代码时,我得到了不正确的结果。

请在下面找到序列号、SYCL 代码和输出截图。请帮我解决这个问题。

提前致谢。

//Serial code

for(int i = 0; i < N; i++)
        a[i]=pow(p+i,q-i);

//Paralle code

queue defaultqueue;
        buffer<unsigned long long int,1> buf(a, range<1>(N));
        defaultqueue.submit([&](handler &cgh)
            auto bufacc = buf.get_access<access::mode::read_write>(cgh);
            cgh.parallel_for<class single_dim>(range<1>(N), [=](nd_item<1> it)
                auto idx = it.get_global_linear_id();
                unsigned long long int x;
                x=pow(p+idx,q-idx);
                bufacc[idx] += x;
            );
        );

Output of parallel code

【问题讨论】:

如何初始化输入数据?你看过github.com/codeplaysoftware/computecpp-sdk这里的示例代码吗? 【参考方案1】:

SYCL 中的内核调用是非阻塞的,即 CPU 在调用内核后继续执行而不等待内核完成

这可能会导致数据不一致,尤其是在您的情况下,因为您在内核启动后立即访问数据。当内核进行大量耗时的计算时,这将更加占主导地位

因此,您可以尝试在内核调用后使用 defaultqueue.wait()

希望这能解决您的问题

【讨论】:

由于代码不完整,很难回答全局问题。例如为什么使用defaultqueue.wait(),因为缓冲区在以后的任何地方都没有使用,所以显然没有什么可等待的。

以上是关于运行 SYCL 代码时结果不正确。在尝试并行化循环时的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 循环运行代码比串行循环慢

OpenMP 嵌套循环任务并行性,计数器未给出正确结果

R中的并行化“查找”循环

用两条语句并行化 while 循环(弗洛伊德循环检测算法)

Python - 使用 joblib 进行循环并行化

sycl::info::event_profiling 中的 command_submit 提交整个代码还是仅提交并行?