Неправильные результаты при запуске кода 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() после вызова ядра

Надеюсь, это решит вашу проблему

Другие вопросы по тегам