问题标签 [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 投票
2 回答
180 浏览

opencl - OpenCL 在运行时从 Host 函数创建内核

我正在尝试一些 OpenCL,并想知道是否有办法将函数作为参数传递给内核,或者最接近的可用匹配项是什么(使用 OpenCL 1.2)。

例如,考虑一个简单的蒙特卡洛积分,如下所示:

我发现在 OpenCL 中将函数作为参数传递,它告诉我传递函数指针不起作用。所以我猜想在运行时生成带有 f 定义的内核源然后编译它会起作用(以前是否做过?如果是这样,我在哪里可以找到它?)。也许这种问题不使用 OpenCL 而是使用 SYCL(我几乎一无所知)更容易解决?

我对此比较陌生,所以如果这种问题以完全不同的方式解决,请告诉我。

0 投票
2 回答
2535 浏览

amd-gpu - 了解 AMD GPU 中的 oneAPI 和 SYCL

我是一名 GPGPU 开发人员,我使用 CUDA 完成了所有工作。最近我为我的家庭设置购买了一个 AMD GPU,并且我一直在阅读有关 SYCL 和 oneAPI 的信息,但我不确定我是否了解它们中的每一个是什么,它们是如何补充的。如果我理解正确的话,SYCL 是由 Khronos 开发的标准,允许在 C++ 中创建并行软件。它需要一个自定义工具链,由 SYCL 实现提供,并且存在多个实现。

另一方面,oneAPI 是 SYCL 的实现,带有一些额外的扩展(将来可能会添加到 SYCL 标准中)和一些具有典型并行库的库,对吧?

由于我有一个 AMD GPU,我想用它来做一些 GPGPU,但是生态系统有点吓人。我们有台面驱动程序、AMD 驱动程序、不同的 openCL 实现、HIP……所有这些假设如何组合在一起?

0 投票
1 回答
218 浏览

c++ - Are SYCL and OpenACC competing frameworks? or complementary?

I'm gathering information about heterogeneous computing. I've come across SYCL and OpenACC. I gather that OpenACC has many pragma directives (similar to OpenMP) to abstract GPU calculations (either OpenCL or CUDA or both??). However, it seems to me that SYCL also tries to abstract GPU portions of the code.

So, are SYCL and OpenACC competing frameworks or can they compliment each other? If they are complimentary, could I use them together?

I'm having trouble understanding the differences between these frameworks and they seem to me as being competitors.

0 投票
2 回答
245 浏览

c++ - 索引访问器时的 EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

我想运行一个并行的 for 循环来初始化一个带有随机值的二维缓冲区。但是我在内核的第一行得到一个 EXC_BAD_ACCESS (code=EXC_I386_GPFLT) 异常。

这是代码(Pixel 结构来自 PixelGameEngine 库):

我在 Mac OS Catalina 上使用 triSYCL 0.1.0 和 boost 1.74 和 C++20。我试图将缓冲区的数据类型从 old::Pixel 更改为 float 并使缓冲区一维,但我总是遇到同样的异常。有人知道我可以尝试什么吗?

0 投票
2 回答
68 浏览

c++ - 在 DPC++ 向量加法中给出更大数组大小的随机退出代码

我正在尝试运行 oneAPI 的 hello-world DPC++ 示例,该示例在 CPU 和 GPU 上添加两个一维数组,并验证结果。代码如下所示:

使用相对较小的array_size,(我测试了 100-50k 个元素)计算结果很好。样本输出:

可以注意到,在 CPU 和 GPU 上完成计算只需要一秒钟。但是当我增加array_size, 说,100000我得到这个看似毫无头绪的错误:

虽然我不确定错误开始发生的精确值是多少,但我似乎确信它会在70000. 我似乎不知道为什么会发生这种情况,对可能出现什么问题有任何见解吗?

0 投票
2 回答
477 浏览

c++ - 使用 2D std::vector 对 SYCL 进行矩阵乘法

我是 SYCL 和 C++ 的新手。这是我使用 2D 进行简单矩阵乘法的内核std::vector

我收到两个错误,如下所示:

  1. 错误 #1:invalid operands to binary expression ('const std::vector<double, std::allocator<double>>' and 'const std::vector<double, std::allocator<double>>')
  2. 错误 #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

任何帮助,将不胜感激。

0 投票
1 回答
216 浏览

c++ - 在 SYCL 中为 2D std::vector 创建缓冲区

std::vector在 SYCL中创建 2D 缓冲区的正确方法是什么?我有一个模板函数,它接收如下所示的参数:

a,b并且c是 2D std::vectors

我已经能够为 2D C 风格的数组实现缓冲区,但是我尝试了多个文档和答案,但似乎没有一个与这个特定的用例相匹配。

0 投票
1 回答
77 浏览

clang - 是否需要构建 LLVM 才能构建 hipSYCL?

我正在运行 Centos 7 并正在尝试构建 hipSYCL(请参见此处

问题是 hipSYCL 需要从 LLVM 构建中获取 cmake 信息(通过 LLVM_DIR cmake 变量)。这对我来说是个问题,因为构建 LLVM 需要大量 35Gb 的库和 exe。我没有那么多内存可以闲置。

我确实为 Centos 7 在线找到了 llvm-toolset-8.0 的构建并安装了它,但令我惊讶的是,这似乎不适用于 LLVM_DIR,因为没有 cmake 文件(因为我没有在本地构建它)。

所以,我的问题是,有没有办法使用预先构建的 LLVM-clang 构建 hipSYCL?

如果我遗漏或误解了某些内容,我将不胜感激。

0 投票
2 回答
327 浏览

opencl - 估计 GPU 矩阵计算的最佳切片大小

我在 SYCL 中编写了一个矩阵乘法内核,基于将子矩阵平铺到本地缓存。使用平铺(平铺尺寸 16x16)和不使用平铺(简单)方法时,我获得的性能提升高达 2 倍。

对于较小的瓷砖尺寸,我接近于天真的速度,这是预期的。对于任何大于 16 的图块大小(我会选择 2 的幂,因为我的矩阵大小也是如此),例如 32,内核会引发 sycl 异常。

我怀疑这是因为 GPU 无法在其本地缓存上容纳更高的切片大小。

问题:

  1. 如何动态确定(并设置)在不同 GPU 上部署时支持的最大切片大小?
  2. 对于 Intel GPU,如何找出最大 GPU 本地缓存大小?

我尝试检查 ark.intel.com,但没有列出 GPU 本地缓存大小。当前设置:带有 Intel UHD 620 的 i7-8665U

PS:如果想看我的内核代码,请加评论,我会加的。我目前不觉得有必要展示内核代码和臃肿的帖子。

0 投票
1 回答
349 浏览

c++ - 在 SYCL 中使用一个缓冲区还是多个缓冲区更有效?

假设我有一个数据数组,例如一个大小为 N 的 3D 向量数组。假设我的 SYCL 内核的每次迭代都专门或主要只关注一个向量。作为一般规则,以下哪一种将其​​分解为连续缓冲区的方法更有效——或者它是否重要?

我意识到目标设备对此有很大影响,所以让我们假设它是一个独立的 GPU(即数据确实必须复制到不同的内存芯片,并且该设备没有像 FPGA 这样的疯狂架构——我是主要针对通过 CUDA 的 GTX 1080,但我希望当代码编译到 OpenCL 或我们使用另一个现代 GPU 时答案可能相似。

  1. 为每个坐标创建一个单独的缓冲区,例如sycl::buffer<float> x, y, z;每个大小为 N 的缓冲区。这样访问它们时,我可以使用sycl::id<1>传递给我的内核 lambda 作为索引而无需数学。(我怀疑编译器可能会对此进行优化。)
  2. 为所有这些创建一个打包缓冲区,例如sycl::buffer<float> coords;大小为 3N。当使用sycl::id<1>被调用访问它们时i,我将 x 坐标设为buffer_accessor[3*i],将 y 坐标设为buffer_accessor[3*i+1],将 z 坐标设为buffer_accessor[3*i+2]。(我不知道编译器是否可以对此进行优化,我不确定对齐问题是否会起作用。)
  3. 使用结构创建一个解压缩缓冲区,例如struct Coord { float x,y,z; }; sycl::buffer<Coord> coords;. 由于对齐填充,内存使用量增加了相当惊人的成本,在这个例子中增加了 33%——这也会增加将缓冲区复制到设备所需的时间。但权衡是您可以在不操作 的情况下访问数据sycl::id<1>,运行时只需处理一个缓冲区,并且设备上不应该出现任何缓存行对齐效率低下的问题。
  4. 使用大小为 (N,3) 的二维缓冲区并仅在第一个维度的范围内进行迭代。这是一个不太灵活的解决方案,我不明白为什么在不迭代所有维度时要使用多维缓冲区,除非为此用例内置了很多优化。

我找不到任何关于数据架构的指南来获得对这类事情的直觉。现在(4)看起来很傻,(3)涉及不可接受的内存浪费,我正在使用(2)但想知道我是否不应该使用(1)来避免 id 操作和 3*sizeof(float)对齐的访问块。