如何在 OpenCL 中验证波前/扭曲大小?

2024-02-11

我使用的是 AMD Radeon HD 7700 GPU。我想使用以下内核来验证波前尺寸是否为 64。

__kernel
void kernel__test_warpsize(
        __global T* dataSet,
        uint size
        )
{   
    size_t idx = get_global_id(0);

    T value = dataSet[idx];
    if (idx<size-1)
        dataSet[idx+1] = value;
}

在主程序中,我传递了一个包含 128 个元素的数组。初始值为dataSet[i]=i。在内核之后,我期望以下值: 数据集[0]=0 数据集[1]=0 数据集[2]=1 ... 数据集[63]=62 数据集[64]=63 数据集[65]=63 数据集[66]=65 ... 数据集[127]=126

但是,我发现dataSet[65]是64,而不是63,这不符合我的预期。

我的理解是,第一个波前(64个线程)应该将dataSet[64]更改为63。因此,当执行第二个波前时,线程#64应该获取63并将其写入dataSet[65]。但我看到 dataSet[65] 仍然是 64。为什么?


您正在调用未定义的行为。如果您希望访问工作组中另一个线程正在写入的内存,则必须使用屏障。

此外,假设 GPU 同时运行 2 个波前。那么 dataSet[65] 确实包含正确的值,第一个波前根本还没有完成。

此外,根据规范,所有项目的输出为 0 也是有效结果。这是因为一切也可以完全串行执行。这就是为什么你需要障碍。

根据您的评论我编辑了这部分:

Install http://developer.amd.com/tools-and-sdks/heterogeneous-computing/codexl/ http://developer.amd.com/tools-and-sdks/heterogeneous-computing/codexl/ Read: http://developer.amd.com/download/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf http://developer.amd.com/download/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf

优化一定数量线程内的分支只是优化的一小部分。您应该了解 AMD 硬件如何在工作组内调度波前,以及如何通过交错执行波前(在工作组内)来隐藏内存延迟。分支还会影响整个工作组的执行,因为运行它的有效时间基本上与执行单个运行时间最长的波前的时间相同(在组中的所有内容完成之前它无法释放本地内存等,因此它无法调度另一个工作组)。但这也取决于您的本地内存和寄存器使用情况等。要查看实际发生的情况,只需获取 CodeXL 并运行 GPU 分析即可。这将准确显示设备上发生的情况。

即使这仅适用于当前一代的硬件。这就是为什么这个概念不在 OpenCL 规范本身中的原因。这些属性变化很大,并且很大程度上取决于硬件。

但如果您真的想知道 AMD 波前尺寸是多少,答案几乎总是 64(请参阅http://devgurus.amd.com/thread/159153 http://devgurus.amd.com/thread/159153参考他们的 OpenCL 编程指南)。构成当前整个产​​品线的所有 GCN 设备均为 64。也许一些较旧的设备有 16 或 32,但现在所有设备都只有 64(对于 nvidia,一般是 32)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 OpenCL 中验证波前/扭曲大小? 的相关文章

  • 在多 GPU 系统中,如何将 OpenCL 设备与给定 PCI 供应商、设备和总线 ID 的特定 GPU 相匹配?

    我希望能够在由 PCI ID 标识的多 GPU 系统上将 OpenCL 设备与系统中的 GPU 进行匹配 例如 如果我的系统具有多个 GPU 可能来自不同的供应商 我可以通过枚举 PCI 总线来列出设备 这为我提供了 PCI 供应商 设备和
  • 什么样的工作受益于 OpenCL

    首先 我很清楚 OpenCL 并没有神奇地让一切变得更快 我很清楚 OpenCL 有局限性 现在回答我的问题 我习惯使用编程进行不同的科学计算 我处理的一些事情在计算的复杂性和数量方面非常激烈 所以我想知道 也许我可以使用 OpenCL 来
  • 限制 AMD OpenCL 的 GPU 数量

    是否有解决方案限制 AMD OpenCL 平台使用的 GPU 数量 对于 NVIDIA 平台 只需设置环境变量即可CUDA VISIBLE DEVICES限制 OpenCL 可用的 GPU 集 编辑 我知道 我可以使用更少的设备创建一个上下
  • cl::vector 与 std::vector:不同的迭代器行为

    EDIT 添加了 PlasmaHH 建议的带有内存位置的调试输出 我不明白 OpenCL 的 C 绑定中 cl vector 的不同行为 考虑以下代码 Header Top hpp class Top public void setBool
  • 工作组之间的 OpenCL 同步

    是否可以同步 OpenCL 工作组 例如 我有 100 个工作组 每个工作组只有一个项目 不要问我为什么 这是一个例子 我需要对每个工作项设置障碍 以确保所有工作组都会在这 100 个工作组中的每个工作项达到此障碍点后继续 不 你不能 您可
  • 如何在 OpenCL 中验证波前/扭曲大小?

    我使用的是 AMD Radeon HD 7700 GPU 我想使用以下内核来验证波前尺寸是否为 64 kernel void kernel test warpsize global T dataSet uint size size t id
  • OpenCL - 将树复制到设备内存

    我用 C 代码实现了二叉搜索树 我的每个树节点如下所示 typedef struct treeNode int key struct treeNode right struct treeNode left treeNode t 宿主建造的树
  • 有多少线程(或工作项)可以同时运行?

    我是 GPGPU 编程新手 正在研究 OpenCL 的 NVIDIA 实现 我的问题是如何计算 GPU 设备的限制 线程数 据我了解 有许多工作组 相当于 CUDA 中的块 其中包含许多工作项 cuda 线程 如何获取我的卡上存在的工作组数
  • OpenCL clGetPlatformIDs 异常

    我使用此包安装附带的示例中的 HelloWorld 示例 AMD 套件 http developer amd com tools and sdks heterogeneous computing amd accelerated parall
  • NVIDIA GPU 的 CUDA 核心和 OpenCL 计算单元之间有什么关系?

    我的电脑有一块 GeForce GTX 960M NVIDIA 声称它有 640 个 CUDA 核心 然而 当我运行 clGetDeviceInfo 来查找计算机中的计算单元数量时 它打印出 5 见下图 听起来 CUDA 核心与 OpenC
  • opencl支持布尔变量吗?

    openCL 支持布尔变量吗 我目前正在使用 JOCL java 编写我的 openCL 调用代码 但我没有看到任何有关布尔值的信息 tl dr 是的 但是你应该在内核函数签名中避免它 是的 但a的大小bool is not定义的 因此 它
  • OpenCL 在调用 clGetPlatformIDs 时崩溃

    我是 OpenCL 新手 在配备 Intel R HD Graphics 4000 运行 Windows 7 的 Core i5 计算机上工作 我安装了支持 OpenCL 的最新 Intel 驱动程序 GpuCapsViewer 确认我有
  • 如何在 Windows 上的 nvidia GPU 的 Visual Studio 2010 中配置 OpenCL?

    我在华硕笔记本电脑上的 Wwindows 7 操作系统上使用 NVIDIA GeForce GTX 480 GPU 我已经为 CUDA 4 2 配置了 Visual Studio 2010 如何在 Visual Studio 2010 上为
  • OpenCL:在内核中手动引发异常

    是否可以在 OpenCL 中手动引发异常 仅用于调试目的 我的代码中有一个非常奇怪的错误 当我计算两个双精度值并将它们相加时 主机报告 CL OUT OF RESOURCE 但是 如果我不添加这两个值 主机不会报告任何错误 OpenCL 不
  • OpenCL 矩阵乘法应该更快?

    我正在尝试学习如何使 GPU 优化 OpenCL 内核 我以使用本地内存中的方形图块进行矩阵乘法为例 然而在最好的情况下 我只得到了约 10 倍的加速 约 50 Gflops 与 numpy dot 相比 5 Gflops 它使用的是 BL
  • Linux 上的 OpenCL 编译

    我是 OpenCL 的新手 从昨天开始 我尝试使用 OpenCL 进行并行编程 而不是使用我更熟悉且以前体验过的 CUDA 现在我有 NVIDIA GTX 580 GPU Ubuntu Linux 12 04 操作系统和 CUDA SDK
  • OpenCL 何时使用全局、私有、本地、常量地址空间

    我正在尝试学习 OpenCL 但我很难决定使用哪些地址空间 因为我只找到组装的资源声明这些地址空间是什么 但没有声明它们为什么存在或何时使用它们 资源至少太分散了 所以带着这个问题我希望把所有这些信息汇总一下 所有地址空间是什么 它们为什么
  • 是否可以在 OpenCL 中并行运行求和计算?

    我是 OpenCL 的新手 不过 我了解 C C 基础知识和 OOP 我的问题如下 是否可以以某种方式并行运行求和计算任务 理论上可能吗 下面我将描述我尝试做的事情 任务例如是 double values new double 1000 l
  • 尽管有障碍,Open CL 仍不同步

    我刚刚开始通过 Python 的 PyOpenCL 接口使用 OpenCL 我尝试创建一个非常简单的 循环 程序 其中每个内核中每个循环的结果取决于上一个循环周期的另一个内核的输出 但我遇到了同步问题 kernel void part1 g
  • OpenGL 与 OpenCL,选择哪个以及为什么?

    哪些功能使 OpenCL 能够独特地选择 OpenGL 和 GLSL 进行计算 尽管有与图形相关的术语和不实用的数据类型 OpenGL 是否有任何真正的警告 例如 可以通过使用其他纹理将 a 渲染到纹理来完成并行函数评估 减少操作可以通过迭

随机推荐

  • 无法使用 VPN 和代理背后的 crashlytics 构建 Android 应用程序

    作为一名远程工作者 我使用 VPN代理 pac 配置文件位于http proxy mycompany com proxy pac http proxy mycompany com proxy pac 更新包安卓SDK管理器 以下代理设置可以
  • 有没有办法通过 sbt 插件获取项目的所有依赖项?

    我想编写一个 sbt 插件 在其中我需要获取当前项目的所有依赖项的列表 有一些信息 是可能的 是否可以 在我们的项目中 我们使用更新任务来获取库依赖项 update map updateReport gt updateReport sele
  • 将文件夹添加到收藏夹并更改文件夹图标 [Electron macOS]

    一周以来 我一直在寻找一种解决方案 将带有特定图标的文件夹添加到收藏夹侧边栏 就像 Dropbox 所做的那样 有什么解决方案可以用 Electron 或 Objective C 来做到这一点吗 到目前为止我发现了什么 自己拖放 filei
  • 每个数据组合的特殊组编号

    我想为每对行分配不同的组号 对于某些配对 分配唯一的编号作为组编号 edit 我们可以认为这些是成对存在于数据中的 如果这些对存在于行中 则为它们分配一个组号 直到出现下一对 因为真实数据中可能还有其他数据行 这是示例数据 names lt
  • Seaborn中轴标签的字体大小

    在seaborn中 如何仅更改x轴和y轴标签字体大小 有没有办法专门更改轴标签 而不是使用 设置上下文 方法 这是我的代码 def corrfunc x y kws r stats pearsonr x y 0 2 ax plt gca a
  • 当 return 语句和对象之间存在换行符时,Javascript 函数无法返回对象?

    这里是jsfiddle http jsfiddle net fzdQP 完整代码 function foo1 return msg hello1 function foo2 return msg hello2 output foo1 msg
  • 是否可以使用CSS取消文本大写,然后重新大写?

    我从外部来源收到了一段全部大写的文本 我希望它的第一个字母简单地大写 看来text transform capitalize不会将单词的其余部分取消大写 有没有办法不用JS就可以做到这一点 像这样的东西吗 http jsbin com ag
  • Rownum 语句返回与没有它时不同的行

    好吧 我有这个 select 语句 它返回担任职员的人数最少的部门编号 但由于数据库中的数据 它返回两个部门 当我添加 rownum 1 时 它给了我一个完全不同的部门编号 其中有最多的职员 我不知道为什么会这样做 感谢帮助 select
  • Gwt 列表框项目对对象的引用

    我有一个列表框 我想添加一些项目 只有将项目添加为字符串的方法 但是 我想使用字符串和对对象的引用向列表框添加一个项目 这样 如果在列表框中选择了某个项目 我也会获得对象引用 否则我必须始终以 equal 方式搜索正确的对象 因此还有什么选
  • 从地图创建字符串

    我目前正在开发一个项目 通过使用上下文无关语法规则 我将生成随机句子 现在 我正在创建一个函数 该函数将接受哈希值 并遍历它 选择正确的产生式来创建句子并将其作为字符串返回 例如 给定以下格式的哈希
  • 随着记录的增长,mongoldb 文档更新的性能下降

    我有一个 iOS 应用程序 它将批量数据发送到 API 端点 该端点将数据存储到 mongodb 数据库中 我的数据建模如下 id ObjectId device id Uuid rtfb status bool repetitions s
  • 如何从数据库插入图像?

    我想在我的报告的详细信息区域中插入数据库中的图像贾斯帕软件工作室 JPG 图像保存在 MySQL 中imgdata类型的longblob 我尝试将此表达式放入 Image 元素中 F imgdata MyUtil getInputStrea
  • 需要 Gradle 版本 1.10。当前版本是2.2.1。在安卓中

    我有一个使用 Android Studio 构建的 Android 项目 并尝试在我的 Android Studio 上导入并运行它 但在尝试同步项目时遇到以下错误 Failed to sync Gradle project project
  • 使用 java api 在 Elasticsearch 中创建索引并添加映射会导致缺少分析器错误

    代码是Scala 语言 它与Java 代码极其相似 我们的地图索引器用于创建索引的代码 https gist github com a16e5946b67c 6d12b2b8 https gist github com a16e5946b6
  • 包含子字符串列表中精确子字符串的字符串

    Scala 初学者在这里 我试图找到所有推文文本中至少包含关键字列表中的一个关键字 given 其中一条推文 case class Tweet user String text String retweets Int 举个例子Tweet u
  • 我如何在我的 Angular 2 项目中使用 daterangepicker js?

    我正在 Angular 2 项目中工作 想要集成 daterangepicker js 库来弹出日期范围选择器 如果您之前没有听说过 这里链接到图书馆http www daterangepicker com http www dateran
  • Redux Toolkit - 我无法更新 Slice 状态?

    我想更新状态并尝试了几种方法来做到这一点 但我不能 首先 我得到了一个problem https stackoverflow com questions 65764486 why reducer function return only p
  • SQL使用触发器进行约束

    我正在研究触发因素和约束因素 我有一个使用触发器的问题 说实话 我不太确定如何使用触发器 假设我们有一个教师表 这个教师表包含teacher id ssn first name last name class time 例如 teacher
  • R 使用 diff:二元运算符错误的非数字参数

    我们使用以下命令解析包含一些数字的 CSV 文件 tt lt read table test2 csv sep stringsAsFactors FALSE 它有效 印刷tt 1 产生一个很好的向量并且sd tt 1 是明智的 然而 当我们
  • 如何在 OpenCL 中验证波前/扭曲大小?

    我使用的是 AMD Radeon HD 7700 GPU 我想使用以下内核来验证波前尺寸是否为 64 kernel void kernel test warpsize global T dataSet uint size size t id