问题标签 [sycl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何在 SYCL 中实现重复的实时任务
在 SYCL 中实现软实时任务的推荐方法是什么?
是不断地向命令队列和调用等待(或 get_access<cl::sycl::access::mode::read_write>() )重新提交操作以触发内核执行和缓冲区传输?
似乎应该有一种方法:A)构建命令队列 B)然后只更改输入缓冲区中的内容 C)触发执行 D)从输出缓冲区收集结果 E)跳回 B)
这不会每次都重新构建命令队列。这是这样做的吗?
c++ - 在 SYCL 中使用 std::atomic_ref / cl::sycl::atomic_ref 进行后读和读后写依赖
假设我们有 2 个长度为 n 的向量 V 和 W。我在 SYCL 中启动了一个内核,它对 V 的每个实体执行 3 次 for 循环迭代。 for 循环的描述如下:
首先,循环根据当前迭代中 V 的 4 个随机值计算索引 (W[idx]) 处的 W 值。即,W[idx] = sum (V[a] + V[b] + V[c]+ V[d])。其中 a、b、c 和 d 不是连续的,而是为每个 idx 定义的。
根据 W[idx] 更新 V[idx]。但是,只有在步骤 1 中使用 V[idx] 处的值来计算 W 之后,才应该对 V[idx] 进行更新。
假设我在内核中有 3 次 for 循环迭代。如果一个线程在迭代 1 中并尝试使用迭代 1 的 V[2] 在迭代 1 中计算 W[idx = 18]。另一个线程假设在迭代 2 中并尝试在迭代 2 中计算 W[2] a,b,c,d 并在迭代 2 中计算 V[2]。
如果第二个线程领先于第一个线程,则第二个线程将在迭代 2 时更新 V[2] 的值。在这种情况下,当第一个线程想要使用第一个迭代的 V[2] 时,我该怎么做确保这是 Syncd。在 SYCL 中。在这种情况下将使用atomic_ref帮助,考虑到第二个线程的目标是仅在线程 [1] 使用 V[2] 之后才写入它。还要注意的是,第一次迭代的这个 V[2] 也需要在第一次迭代中计算一些其他的 W 以及在其他一些线程中运行的第一次迭代。如何确保第二次迭代中的 V[2] 的值在第二次迭代中得到更新,只有当第一次迭代的 V[2] 已在所有必需的实例中使用时?这是源代码:
如果您看到,对于每次迭代,我都被迫启动 2 个内核,以便我可以在 2 个计算之间创建一个同步点。并且在第二次计算结束时。我想找到一种方法,只创建一个内核,并在存在同步的情况下在该内核内执行迭代。
c++ - SYCL/DPC++ cpu 版本给出了正确的结果,但 gpu 给出了不正确的数据
我使用 intel dpc++ 编译器编译并运行了以下代码。使用 cpu 选择器时我得到了正确的结果,但 gpu 选择器给出了垃圾值。
我的代码所做的只是将一个名为 data 的数组初始化为全 1。在 sycl 内核中,对该数组的访问器乘以 3 并保存到结果数组中。我尝试在结果数组中打印值,该数组预计将全部为 3,但我得到了垃圾值。
因为我在 gpu 上执行代码时得到垃圾值。我尝试在 cpu selector 上运行,这里的代码没有问题。
我在linux和windows上试过这个。编译器版本 dpcpp 2021.3
有人可以帮助为什么代码会在 GPU 上给出错误的结果吗?
c++ - dpc++ 错误 提交的命令组没有内核或显式内存操作。-59(CL_INVALID_OPERATION)
我正在尝试 sycl/dpc++。我写了下面的代码。我正在设备端创建一个数组 deviceArr,使用 memcpy 将 hostArr 的值复制到该数组,然后使用 parallel_for 内核将 devicearray 的值增加 1,并使用 memcpy 将值复制回来。
这段代码编译得很好,但是在运行时我在运行时收到以下错误。
但是我可以看到我提交的所有队列都有内核(parallel_for
)或内存操作(memcpy
)。谁能解释为什么会发生此错误?
c++ - 运行 SYCL/DPC++ 代码时出现意外/错误结果
我是 SYCl/DPC++ 的初学者。我想打印 10 的倍数,但不是那样,而是用 0 代替。
我正在使用 USM(统一共享内存),并且正在隐式检查共享内存和主机内存中的数据移动。因此,我创建了两个数组,并对其进行了初始化和操作。我可以看到他们两个相同的结果。
这是我的代码;我不明白我哪里出错了。
预期成绩:
实际输出:
c++ - Intel oneAPI DPCT 无法从 CUDA 1 通道纹理转换为 DPCT 4 通道 image_wrapper
我有以下问题:
我有一个使用纹理的 CUDA 代码,例如:
所以当我使用 DPCT 时,我有这个输出:
所以,我用这个改变了声明:
我的问题是我不知道如何在阅读时创建等价物。我有这个:
但我不知道如何在我的 DPC 代码中从 CUDA 获取相同的无符号字符。我必须修改读取的索引吗?我真的迷路了。
非常感谢您!
c++ - Unable to get values from kernel code in SYCL/DPC++
I am a beginner in SYCL/DPC++. I have created an array and by using buffers I am updating the values in the device code but when I try to print the updated values in the kernel/device code I am getting error. I am able to print the updated values through accessors and arrays. Can someone help me out how can I print/get the values from kernel code?
Here is my code.
I got these errors while compiling the code
c++ - 错误:从 'std::array 没有可行的转换' 到 'const void *' 使用 SYCL/DPC++
我是 SYCL/DPC++ 的初学者。我已经使用 USM(统一共享内存)编写了一个代码,并采用了两个数组主机和设备数组,我想在其中将主机数组值复制到设备数组并执行基本操作并打印这些值。但是在编译的时候,我得到了一个错误。
这是我的代码。
编译错误
有人可以帮我在哪里出错吗?
提前致谢。
c++ - 如何使用 DPC++ 和 CMake 构建 SYCL 程序?
背景
我正在尝试使用 CUDA 后端学习 SYCL(我使用这些指令编译了 dpc++ 编译器,并且矢量添加有效)。然而,第二天我无法使用 CMake 让书中的第一个示例工作,但是使用命令行和调用编译器直接解决了这个问题。
我使用这个脚本来设置环境变量:
这是我的 CMakeLists.txt:
以下是链接器错误的前几行:
我该如何解决?我的直觉告诉我,编译器在直接调用时以不同的方式调用链接器,并且我没有指定链接过程的一些非常重要的部分。
使用详细模式调用编译器会给出以下链接命令:
除了链接器错误之外,还有更多警告,这表明编译器未处于正确的“模式”。我不知道接下来从哪里开始挖掘。
sycl - (SYCL) local_accessor 问题(没有名为“local_accessor”的模板)
嗨,我对 c++ 和 sycl 很陌生。所以请尽可能具体。这是我尝试编译的代码:
这是一个简单的矩阵乘法代码,我正在尝试将 ND_kernel 用于此 sycl 应用程序。但是当我尝试编译它时,我遇到了这样的错误:
hellocl.cpp(128,13): 错误: 没有名为“local_accessor”的模板 local_accessor tileA{tile_size, cgh}; ^ hellocl.cpp(131,1): 错误: 使用未声明的标识符 'nd_range' nd_range<2>{{N, N}, {1, tile_size}}, [=](nd_item<2> it) { ^ 2产生的错误。
ND_range 示例来自https://www.khronos.org/developers/books/的“Data Parallel C++”一书。从第 225 页开始。