Неправильные результаты при запуске кода SYCL. при попытке параллельного цикла
Я новичок в этой области параллельного программирования. Я пытаюсь распараллелить ниже последовательный код в 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;
});
});
1 ответ
Вызовы ядра в SYCL являются неблокирующими, т. Е. Процессор продолжает выполнение после вызова ядра, не дожидаясь завершения работы ядра.
Это может привести к несогласованности данных, особенно в вашем случае, поскольку вы получаете доступ к данным сразу после запуска ядра. Это будет более преобладать, когда ядро выполняет тяжелые вычисления, требующие много времени.
Итак, вы можете попробовать использовать defaultqueue.wait() после вызова ядра
Надеюсь, это решит вашу проблему