问题标签 [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.

0 投票
1 回答
288 浏览

c++ - 为自定义对象 oneAPI 创建数据缓冲区时遇到问题

我是 oneAPI 和类似框架的新手,所以我在使用 SYCL 数据缓冲区进行数据管理时遇到了麻烦。

我的任务是使用 Aho-Corasick 算法在给定字符串中查找子字符串。

我的想法是构建一个 trie,然后提交一个内核,该内核将在 trie 中并行查找子字符串。因此,为此我创建了一个 SYCL 队列,为字符串(用于在其中查找子字符串)、向量(用于存储搜索结果)和我的 Aho-Corasick 对象创建了缓冲区,该对象包含先前构建的树的根. 但是,关于最后一个我不确定,因为我正在为主机内存中的一个对象创建一个缓冲区,该缓冲区包含指向其他对象的指针(例如节点,它包含指向其他节点的指针)。

Node对象的结构:

这是搜索方法:

缓冲器:

并排队求和:

我发现程序在尝试访问子地图的项目后失败了。因此,我认为问题在于存储在 map 中的指针是指向主机内存的指针,设备无权访问。

0 投票
2 回答
408 浏览

c++ - sycl 内核调用很慢

我是 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函数内的代码:

我在用:

  • 视觉工作室 2019
  • ComputeCpp 社区 2.0.0
  • 最新的 Cuda 驱动程序
  • NVIDIA Gtx 980 ptx64(实验性 ComputeCpp 支持)

计算++调用:

总结:
一个sycl内核的总执行时间很慢。我可以在这里做些什么来改进它,还是因为在 Nvidia gpus 上实现了 sycl/computecpp 并且预计会这么慢?

0 投票
1 回答
444 浏览

sycl - sycl/dpc++ 访问器与内核函数对象中的 global_ptr

以下玩具代码使用 Intel OneAPI beta6。

问题:为什么 Increment_pointer 版本“错误”?没有编译/运行时错误。你只是没有在最后得到递增的 hbuffer。(我玩过一些类似的版本,其中 operator() 中的 ptr 最终为 0x0)。

我仍在学习用“SYCL”进行思考,因此欢迎详细解释。

0 投票
1 回答
85 浏览

c - 将函数体从 C 传递到 C++

不确定这是否可能。我需要将一个函数从 C 传递到 C++。它不能是函数指针。

我需要调用的 C++ 函数:

我想给 parfor 的 C 函数(这里的 ptr 可以是全局指针):

C Main 看起来像这样:

我可以将我的函数定义放在标题中。在 C++ 方面,我有一个函数(来自外部库),它采用 C++ lambda 或 C++ 仿函数。它被模板化为 lambda

我目前的想法是将我的 C 函数放在一个文件中,为它们编译 LLVM IR,并以某种方式强制将 clang 生成的 IR 内联到我的 C++ 函数中。C 调用 mycppfunc(mycfunc)。mycppfunc 具有用于 mycfunc 的 LLVM IR,并且能够生成正确的代码。我尝试了这个,但是由于似乎不兼容的 IR,编译器在链接阶段崩溃了。

0 投票
1 回答
161 浏览

sycl - 将访问器转换为内核代码中的 C++ 指针(尤其是(int (*)[Nelem])

环境:Ubuntu 18.04,OneAPI beta 6

完整的代码如下,但这是令人讨厌的错误:

有点解释,以防你想知道为什么......

在开发数据并行代码时,我经常开发英特尔曾经称之为“基本函数”的东西。这些被编写用于对应用程序的单个元素(SYCL 将其称为工作项)进行操作。我一直发现使用基本的软件开发环境更容易做到这一点,易于测试,并且更普遍地可重用(标量、SIMD、CUDA 等)。

在对单个元素进行测试之后,通过扩展调用代码而无需重写/重新测试函数,移动到数据并行非常容易:

变成

在 SYCL 内核中, fn1(x[item.get_linear_id()], NELEM); 将是我所需要的,而不必重写函数来理解 id 和/或访问器。

上述代码的 SYCL 问题是,在内核 C++ 中,我似乎无法将访问器指针重铸为 2D 指针。这在应用程序 C++ 中是允许的(参见上面的代码)。

也许这是一种纠正代码的坏方法,但它使开发/测试适用于标量和数据并行代码的代码变得容易,并使库在某种程度上具有可移植性。它还提供了一种绕过缓冲区/访问器的 SYCL 3 维限制的方法。

无论如何,我很好奇真正的 SYCL 程序员会怎么想。

玩具示例的完整代码:

编辑1:

根据 illuhad 的评论,我试图充实一些替代方案。

首先,这两行评论似乎应该按照他的建议做:

但实际上它会产生这个错误:

在 get_pointer 的末尾添加一个“get()”会产生相同的结果。

奇怪的是,解决错误的“初始化”部分:

产生有趣的错误:

所以如果/当有人有时间时,我仍然很好奇......

0 投票
2 回答
1284 浏览

macos - 在 MacOS 中使用 SYCL 1.2

我想开始使用SYCL,但到目前为止我发现需要安装ComputeCpp,它只支持Ubuntu、CentOS和Windows。在 MacOS Catalina 上使用 SYCL 的替代方法是什么?

0 投票
2 回答
99 浏览

c++ - 如何循环调用模板函数?

这个问题主要是关于设计方法的,我想知道如何用现代 C++ 语言解决这类问题。

我有一个定义如下的库函数(这是来自编译器的真实代码):

为了调用此函数,我可以编写如下内容:

其中cl::sycl::info::device::device_type是实际参数。

有很长的受支持参数列表,我想要一组结果值(不同函数调用的结果)。

此时,我可以执行以下操作:

但因为这很糟糕,我正在 C++ 11/14 中寻找更好的解决方案。

0 投票
1 回答
53 浏览

c++17 - 当 tricycle::device::~device 被调用时,triSYCL 抛出 non_cl_error

我正在尝试使用 triSYCL 运行并行 for 循环。这是我的代码:

我正在用这个 CMakeLists.txt 文件构建它:

当我尝试运行它时,我收到以下消息:libc++abi.dylib: terminating with uncaught exception of type trisycl::non_cl_errorfrom path/to/SYCL/include/triSYCL/command_group/detail/task.hpp line: 278 function: trisycl::detail::task::get_kernel,消息是:“Cannot use an OpenCL kernel in this context” .

我试图mapNumber在内核中创建一个 lambda ,但这没有任何区别。我还尝试在范围结束之前使用它来捕获错误:

但除了之前的错误之外,没有任何内容打印到控制台。而且我还尝试进行queue.submit调用事件,然后event.wait()在范围结束之前调用,但输出完全相同。

有没有人知道我还能尝试什么?

0 投票
0 回答
112 浏览

sycl - SYCL 规范 1.2.1(第 7 版)第 4.8.9.3 节错误?

根据 SYCL 1.2.1 规范(修订版 7)第 4.8.9.3 节中的代码,我编写了以下代码:

使用 OneAPI beta07 编译时会出现许多错误。

规范中的示例似乎存在许多问题。一,OneAPI 和规范本身似乎都没有“build_from_name”方法。二,示例同时使用“MyProgram”和“myProgram”(次要但让我相信这不是来自经过验证的代码)。最后,我无法识别具有与示例匹配的签名的 parallel_for。

只是好奇怎么回事。

0 投票
1 回答
380 浏览

opencv - OpenCl header cl.h not found VS2019 ComputeCpp in SYCL/include_opencl.h

问题 1(使用 Vcpkg 暂时解决)

我已经阅读了所有类似/相关的问题,但我在这里不知所措 - 我使用 Cmake 根据指南(https://developer.codeplay.com/products/computecpp/ )为 ComputeCpp 示例构建 VS2019 项目文件ce/指南)。

我对 Cmake 不是非常熟悉,但我设法使用 Cmake GUI 而不是命令行生成它们,设置所有标志,例如 OpenMP 支持(但它似乎不相关) - 无论如何

我已将 OpenCl 标头添加到项目设置中的附加包含目录中。请参阅下面的屏幕截图。我添加了使用 ptx (compute++ -sycl -sycl-target ptx64) 的编译器标志 - 我在 Nvidia GTX 1650 上。

为什么它会抛出

错误 - 使用 cmd 退出代码 1

?

VS19 包括 1

VS19 包括 2

===============

临时解决方案和问题 2

我已经使用带有命令的 Vcpkg 安装了标头vcpkg install opencl:x64-windows- 但是我有 4 个我目前无法处理的新错误:

在此处输入图像描述

这条路径似乎有些混乱 - 我不确定发生了什么 - c1xx 文件有什么用?

好像路径D:\Google Drive\IM\Semester_4\ModalSynth_GPU\computecpp-sdk-master\computecpp-sdk-master\build\tests\vptr\basic.cc被分割了

进入

什么?谢谢。

这是我的 computecpp_info 输出供参考: