如何将这个简单的 OpenACC 代码转换为 SYCL?

How do I translate this simple OpenACC code to SYCL?

我有这个代码:

#pragma acc kernels
#pragma acc loop seq
for(i=0; i<bands; i++)
{
    mean=0;

    #pragma acc loop seq
    for(j=0; j<N; j++)
        mean+=(image[(i*N)+j]);

    mean/=N;
    meanSpect[i]=mean;

    #pragma acc loop
    for(j=0; j<N; j++)
        image[(i*N)+j]=image[(i*N)+j]-mean;
}

如您所见,第一个循环被告知以顺序/单线程模式执行,第一个循环也在内部,但最后一个循环可以并行化,所以我这样做了。

我的问题是,如何将其转换为 SYCL?我是否将所有内容都放在一个 q.submit() 中,然后在里面只为并行区域创建一个 parallel_for() ?这可能(并且正确)吗?

第二个问题,上面的代码继续如下:

#pragma acc parallel loop collapse(2)
for(j=0; j<bands; j++)
    for(i=0; i<bands; i++)
        Corr[(i*bands)+j] = Cov[(i*bands)+j]+(meanSpect[i] * meanSpect[j]);

如何在 SYCL 中指示 collapse() 标签?它存在还是我必须以其他方式编程?

非常感谢您。

以防有人看到,这里是正确答案:

第一个代码:

for(i=0; i<bands; i++)
{
  mean=0;

  for(j=0; j<N; j++)
     mean+=(image[(i*N)+j]);

  mean/=N;
  meanSpect[i]=mean;

  q.submit([&](auto &h) {
    h.parallel_for(range(N), [=](auto j) {
       image[(i*N)+j]=image[(i*N)+j]-mean;
    });
  }).wait();
}

第二个代码:

    q.submit([&](auto &h) {
       h.parallel_for(range<2>(bands_sycl,bands_sycl), [=](auto index) {
         int i = index[1];
         int j = index[0];
         Corr[(i*bands)+j] = Cov[(i*bands)+j]+(meanSpect[i] * meanSpect[j]);
       });
    }).wait();