问题标签 [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++ - 为自定义对象 oneAPI 创建数据缓冲区时遇到问题
我是 oneAPI 和类似框架的新手,所以我在使用 SYCL 数据缓冲区进行数据管理时遇到了麻烦。
我的任务是使用 Aho-Corasick 算法在给定字符串中查找子字符串。
我的想法是构建一个 trie,然后提交一个内核,该内核将在 trie 中并行查找子字符串。因此,为此我创建了一个 SYCL 队列,为字符串(用于在其中查找子字符串)、向量(用于存储搜索结果)和我的 Aho-Corasick 对象创建了缓冲区,该对象包含先前构建的树的根. 但是,关于最后一个我不确定,因为我正在为主机内存中的一个对象创建一个缓冲区,该缓冲区包含指向其他对象的指针(例如节点,它包含指向其他节点的指针)。
Node对象的结构:
这是搜索方法:
缓冲器:
并排队求和:
我发现程序在尝试访问子地图的项目后失败了。因此,我认为问题在于存储在 map 中的指针是指向主机内存的指针,设备无权访问。
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 并且预计会这么慢?
sycl - sycl/dpc++ 访问器与内核函数对象中的 global_ptr
以下玩具代码使用 Intel OneAPI beta6。
问题:为什么 Increment_pointer 版本“错误”?没有编译/运行时错误。你只是没有在最后得到递增的 hbuffer。(我玩过一些类似的版本,其中 operator() 中的 ptr 最终为 0x0)。
我仍在学习用“SYCL”进行思考,因此欢迎详细解释。
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,编译器在链接阶段崩溃了。
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()”会产生相同的结果。
奇怪的是,解决错误的“初始化”部分:
产生有趣的错误:
所以如果/当有人有时间时,我仍然很好奇......
macos - 在 MacOS 中使用 SYCL 1.2
我想开始使用SYCL,但到目前为止我发现需要安装ComputeCpp,它只支持Ubuntu、CentOS和Windows。在 MacOS Catalina 上使用 SYCL 的替代方法是什么?
c++ - 如何循环调用模板函数?
这个问题主要是关于设计方法的,我想知道如何用现代 C++ 语言解决这类问题。
我有一个定义如下的库函数(这是来自编译器的真实代码):
为了调用此函数,我可以编写如下内容:
其中cl::sycl::info::device::device_type
是实际参数。
有很长的受支持参数列表,我想要一组结果值(不同函数调用的结果)。
此时,我可以执行以下操作:
但因为这很糟糕,我正在 C++ 11/14 中寻找更好的解决方案。
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_error
from 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()
在范围结束之前调用,但输出完全相同。
有没有人知道我还能尝试什么?
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。
只是好奇怎么回事。
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
?
===============
临时解决方案和问题 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 输出供参考: