Unexpected/Incorrect 结果 运行 SYCL/DPC++ 代码
Unexpected/Incorrect Results while running SYCL/DPC++ code
我是 SYCl/DPC++ 的初学者。我想打印 10 的倍数,但我用 0 代替它。
我正在使用 USM(统一共享内存)并且正在隐式检查共享内存和主机内存中的数据移动。所以我创建了两个数组,我已经初始化并对它们执行操作。我可以看到两者的结果相同。
这是我的代码;我不明白我哪里错了。
#include <CL/sycl.hpp>
#include<iostream>
using namespace std;
using namespace sycl;
constexpr int n = 10;
int main() {
queue q;
int *hostArray = malloc_host<int>(n, q);
int *sharedArray = malloc_shared<int>(n, q);
for (int i = 0; i < n; i++)
hostArray[i] = i;
q.submit([&](handler &h) {
h.parallel_for(n, [=](id<1> i) {
sharedArray[i] = hostArray[i] * 10;
});
});
for (int i = 0; i < n; i++) {
hostArray[i] = sharedArray[i];
cout<<hostArray[i]<<" "<<sharedArray[i];
cout<<"\n";
}
cout<<"\n";
return 0;
}
预期结果:
0 0
10 10
20 20
30 30
40 40
50 50
60 60
70 70
80 80
90 90
实际输出:
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
您在队列提交和主机代码中的 for 循环之间缺少屏障。
虽然在主机和设备上确实可以看到 USM 共享内存分配,但不能保证您提交到队列的命令组会在主机中的 for 循环之前执行:提交到队列异步执行 w.r.t 到调用线程。
更新了以下代码:
#include <CL/sycl.hpp>
#include<iostream>
using namespace std;
using namespace sycl;
constexpr int n = 10;
int main() {
queue q;
int *hostArray = malloc_host<int>(n, q);
int *sharedArray = malloc_shared<int>(n, q);
for (int i = 0; i < n; i++)
hostArray[i] = i;
q.submit([&](handler &h) {
h.parallel_for(n, [=](id<1> i) {
sharedArray[i] = hostArray[i] * 10;
});
});
// Wait for completion of all previously submitted command groups
q.wait();
for (int i = 0; i < n; i++) {
hostArray[i] = sharedArray[i];
cout<<hostArray[i]<<" "<<sharedArray[i];
cout<<"\n";
}
cout<<"\n";
return 0;
}
我是 SYCl/DPC++ 的初学者。我想打印 10 的倍数,但我用 0 代替它。
我正在使用 USM(统一共享内存)并且正在隐式检查共享内存和主机内存中的数据移动。所以我创建了两个数组,我已经初始化并对它们执行操作。我可以看到两者的结果相同。
这是我的代码;我不明白我哪里错了。
#include <CL/sycl.hpp>
#include<iostream>
using namespace std;
using namespace sycl;
constexpr int n = 10;
int main() {
queue q;
int *hostArray = malloc_host<int>(n, q);
int *sharedArray = malloc_shared<int>(n, q);
for (int i = 0; i < n; i++)
hostArray[i] = i;
q.submit([&](handler &h) {
h.parallel_for(n, [=](id<1> i) {
sharedArray[i] = hostArray[i] * 10;
});
});
for (int i = 0; i < n; i++) {
hostArray[i] = sharedArray[i];
cout<<hostArray[i]<<" "<<sharedArray[i];
cout<<"\n";
}
cout<<"\n";
return 0;
}
预期结果:
0 0
10 10
20 20
30 30
40 40
50 50
60 60
70 70
80 80
90 90
实际输出:
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
您在队列提交和主机代码中的 for 循环之间缺少屏障。
虽然在主机和设备上确实可以看到 USM 共享内存分配,但不能保证您提交到队列的命令组会在主机中的 for 循环之前执行:提交到队列异步执行 w.r.t 到调用线程。 更新了以下代码:
#include <CL/sycl.hpp>
#include<iostream>
using namespace std;
using namespace sycl;
constexpr int n = 10;
int main() {
queue q;
int *hostArray = malloc_host<int>(n, q);
int *sharedArray = malloc_shared<int>(n, q);
for (int i = 0; i < n; i++)
hostArray[i] = i;
q.submit([&](handler &h) {
h.parallel_for(n, [=](id<1> i) {
sharedArray[i] = hostArray[i] * 10;
});
});
// Wait for completion of all previously submitted command groups
q.wait();
for (int i = 0; i < n; i++) {
hostArray[i] = sharedArray[i];
cout<<hostArray[i]<<" "<<sharedArray[i];
cout<<"\n";
}
cout<<"\n";
return 0;
}