我是 stackoverflow、sycl 和 gpu 编程的新手。我有一个使用基本 sycl 内核的项目。逻辑是有效的,所以我在问题中跳过它。在编译和执行过程中也没有错误。
现在最大的问题是sycl代码的调用很慢。首先,我认为这是一些内存复制或类似的,所以除了您在下面看到的内容(最低限度,注释是在不是最小内核时代码所在的位置)之外,我遗漏了任何内容。
我测量的时间:(发布 x64)
- 显示 Visual Studio 调试器,空内核调用的函数总时间:~100 ms
- 使用 Cuda Nsight,OpenCl 内核执行时间:~5 us
5 us 的内核 gpu 时间在空内核的情况下非常快。但是我的代码中 c++ 函数的总时间慢了 100 毫秒。
这里可能是什么问题?还是 sycl 开销预计会这么慢?(我真的怀疑)
我的努力:
- 我将我的 compute++.exe 标志从 -O2 更改为 -O3,这将总时间缩短了大约 5 到 10 毫秒。
- 我将内核设为最低限度
dll函数内的代码:
{ //scope
sycl::gpu_selector gpuSel;
sycl::queue myQueue(gpuSel);
//....buffers
auto ra = range<1>(size);
myQueue.submit([&](sycl::handler& hd)
{
//....get_access<access::mode::read>
auto kernel = ([=](cl::sycl::id<1> id)
{
//...some vector math
});
hd.parallel_for<someName>(ra, kernel);
});
myQueue.wait();
}
我在用:
- 视觉工作室 2019
- ComputeCpp 社区 2.0.0
- 最新的 Cuda 驱动程序
- NVIDIA Gtx 980 ptx64(实验性 ComputeCpp 支持)
计算++调用:
"..\compute++.exe" -sycl -D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH -O3 -mllvm -inline-threshold=1000 -intelspirmetadata -sycl-target ptx64 -std=c++14 -I"../Codeplay/ComputeCpp/include" -I"../NVIDIA GPU Computing Toolkit/CUDA/v10.2/include" -sycl-ih something.cpp.sycl -c something.cpp
总结:
一个sycl内核的总执行时间很慢。我可以在这里做些什么来改进它,还是因为在 Nvidia gpus 上实现了 sycl/computecpp 并且预计会这么慢?