问题标签 [dpc++]
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.
ccl - CCL 代码示例中的缓冲区以及 oneapi 工具包
我正在浏览 CCL 代码示例以及 oneapi 工具包。在下面的 DPC++(SYCL) 代码中,最初 sendbuf 在 cpu 端创建了一个缓冲区,但未初始化,在卸载到目标设备的部分中,dev_acc_sbuf[id] 变量是内核范围内的一个变量被修改. 因此,该变量(dev_acc_sbuf)没有在程序中使用,也没有将其值复制回 sendbuf。然后在下一行中,sendbuf 变量用于 allreduce。我无法理解更改 dev_acc_sbuf 如何更改 sendbuf。
sycl - 如何在 SYCL parallel_for(内核)中打印?
我正在研究与 oneAPI basekit 一起提供的 vectorAdd 示例应用程序。当我尝试在内核中打印总和时,出现以下错误。
编译时请查找随附的源代码和错误。
在编译期间,我收到以下错误。
parallel-processing - 运行 SYCL 代码时结果不正确。在尝试使循环并行化时
我是这个并行编程领域的新手。我正在尝试在 SYCL 中并行化以下串行代码。但是当我尝试运行代码时,我得到了不正确的结果。
请在下面找到序列号、SYCL 代码和输出屏幕截图。请帮我解决一下这个。
提前致谢。
c++ - 为自定义对象 oneAPI 创建数据缓冲区时遇到问题
我是 oneAPI 和类似框架的新手,所以我在使用 SYCL 数据缓冲区进行数据管理时遇到了麻烦。
我的任务是使用 Aho-Corasick 算法在给定字符串中查找子字符串。
我的想法是构建一个 trie,然后提交一个内核,该内核将在 trie 中并行查找子字符串。因此,为此我创建了一个 SYCL 队列,为字符串(用于在其中查找子字符串)、向量(用于存储搜索结果)和我的 Aho-Corasick 对象创建了缓冲区,该对象包含先前构建的树的根. 但是,关于最后一个我不确定,因为我正在为主机内存中的一个对象创建一个缓冲区,该缓冲区包含指向其他对象的指针(例如节点,它包含指向其他节点的指针)。
Node对象的结构:
这是搜索方法:
缓冲器:
并排队求和:
我发现程序在尝试访问子地图的项目后失败了。因此,我认为问题在于存储在 map 中的指针是指向主机内存的指针,设备无权访问。
sycl - sycl/dpc++ 访问器与内核函数对象中的 global_ptr
以下玩具代码使用 Intel OneAPI beta6。
问题:为什么 Increment_pointer 版本“错误”?没有编译/运行时错误。你只是没有在最后得到递增的 hbuffer。(我玩过一些类似的版本,其中 operator() 中的 ptr 最终为 0x0)。
我仍在学习用“SYCL”进行思考,因此欢迎详细解释。
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()”会产生相同的结果。
奇怪的是,解决错误的“初始化”部分:
产生有趣的错误:
所以如果/当有人有时间时,我仍然很好奇......
c++ - 如何在 DPC++ 编译器选项中指定 C++ 标准版本?
我偶然发现了英特尔 oneAPI 工具包形式的免费东西,一切都很好,示例编译得很好,但我不知道如何在编译器选项中指定 C++ 标准。据我了解,DPC++ 是建立在 Clang 之上的,所以我应该能够选择它编译的 C++ 版本,但我不知道如何。
如何让我的 C++17 代码工作?
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。
只是好奇怎么回事。
c++ - 在 DPC++ 向量加法中给出更大数组大小的随机退出代码
我正在尝试运行 oneAPI 的 hello-world DPC++ 示例,该示例在 CPU 和 GPU 上添加两个一维数组,并验证结果。代码如下所示:
使用相对较小的array_size
,(我测试了 100-50k 个元素)计算结果很好。样本输出:
可以注意到,在 CPU 和 GPU 上完成计算只需要一秒钟。但是当我增加array_size
, 说,100000
我得到这个看似毫无头绪的错误:
虽然我不确定错误开始发生的精确值是多少,但我似乎确信它会在70000
. 我似乎不知道为什么会发生这种情况,对可能出现什么问题有任何见解吗?
c++ - 使用 2D std::vector 对 SYCL 进行矩阵乘法
我是 SYCL 和 C++ 的新手。这是我使用 2D 进行简单矩阵乘法的内核std::vector
。
我收到两个错误,如下所示:
- 错误 #1:
invalid operands to binary expression ('const std::vector<double, std::allocator<double>>' and 'const std::vector<double, std::allocator<double>>')
- 错误 #2:
no viable overloaded '='
我尝试查找类似于 的错误invalid operands for binary expression (...)
,但它们似乎都不能帮助调试我的具体情况。也许是因为这对初学者不友好。
从我目前的理解来看,a_host.data()
显示了一个返回类型std::vector<double>
(不应该是std::vector< std::vector<double> >
吗?)。
我尝试过使用std::array
静态已知的尺寸,它可以工作。
如何使用 2D 完成这项工作std::vector
?
任何帮助,将不胜感激。