运行 SYCL 代码时结果不正确。在尝试并行化循环时
Incorrect results when runnig SYCL code. while trying to parallize loop
我是这个并行编程领域的新手。我正在尝试在 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
SYCL 中的内核调用是非阻塞的,即 CPU 在调用内核后继续执行而不等待内核完成
这可能会导致数据不一致,尤其是在您的情况下,因为您是在内核启动后立即访问数据。当内核进行大量耗时的计算时,这将更加突出
因此,您可以尝试在内核调用后使用 defaultqueue.wait()
希望这能解决您的问题
我是这个并行编程领域的新手。我正在尝试在 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
SYCL 中的内核调用是非阻塞的,即 CPU 在调用内核后继续执行而不等待内核完成
这可能会导致数据不一致,尤其是在您的情况下,因为您是在内核启动后立即访问数据。当内核进行大量耗时的计算时,这将更加突出
因此,您可以尝试在内核调用后使用 defaultqueue.wait()
希望这能解决您的问题