如何将这个简单的 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();
我有这个代码:
#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();