最终减少的策略

2023-11-23

我正在尝试实现一个 OpenCL 版本来减少浮点数组。

为了实现这一目标,我采用了在网上找到的以下代码片段:

__kernel void sumGPU ( __global const double *input, 
                       __global double *partialSums,
               __local double *localSums)
 {
  uint local_id = get_local_id(0);
  uint group_size = get_local_size(0);

  // Copy from global memory to local memory
  localSums[local_id] = input[get_global_id(0)];

  // Loop for computing localSums
  for (uint stride = group_size/2; stride>0; stride /=2)
     {
      // Waiting for each 2x2 addition into given workgroup
      barrier(CLK_LOCAL_MEM_FENCE);

      // Divide WorkGroup into 2 parts and add elements 2 by 2
      // between local_id and local_id + stride
      if (local_id < stride)
        localSums[local_id] += localSums[local_id + stride];
     }

  // Write result into partialSums[nWorkGroups]
  if (local_id == 0)
    partialSums[get_group_id(0)] = localSums[0];
 }                  

该内核代码运行良好,但我想通过添加每个工作组的所有部分总和来计算最终总和。 目前,我通过 CPU 使用简单的循环和迭代来完成最终求和的这一步nWorkGroups.

我还看到了另一个带有原子函数的解决方案,但它似乎是为 int 实现的,而不是为 float 实现的。我认为只有CUDA提供了float的原子函数。

我还看到我可以使用另一个内核代码来执行此求和操作,但我想避免使用此解决方案以保持简单的可读源。也许没有这个解决方案我就不行......

我必须告诉你,我使用 OpenCL 1.2(由clinfo)在 Radeon HD 7970 Tahiti 3GB 上(我认为我的卡不支持 OpenCL 2.0)。

更一般地说,我想获得有关使用我的显卡型号和 OpenCL 1.2 执行最后一次求和的最简单方法的建议。


如果该浮点数的数量级小于exa规模,然后:

代替

if (local_id == 0)
  partialSums[get_group_id(0)] = localSums[0];

你可以使用

if (local_id == 0)
{
    if(strategy==ATOMIC)
    {
        long integer_part=getIntegerPart(localSums[0]);
        atom_add (&totalSumIntegerPart[0] ,integer_part);
        long float_part=1000000*getFloatPart(localSums[0]);
         // 1000000 for saving meaningful 7 digits as integer
        atom_add (&totalSumFloatPart[0] ,float_part);
    }
}

这将溢出浮点部分,因此当您在另一个内核中将其除以 1000000 时,它可能具有超过 1000000 的值,因此您可以获得其整数部分并将其添加到实数部分:

   float value=0;
   if(strategy==ATOMIC)
   {
       float float_part=getFloatPart_(totalSumFloatPart[0]);
       float integer_part=getIntegerPart_(totalSumFloatPart[0])
       + totalSumIntegerPart[0];
       value=integer_part+float_part;
   }

仅仅一些原子操作不应该在整个内核时间上有效。

其中一些get___part可以使用 Floor 和类似的函数轻松编写。有些需要除以1M。

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

最终减少的策略 的相关文章

  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • 高效创建抗锯齿圆形蒙版

    我正在尝试创建抗锯齿 加权而不是布尔 圆形掩模 以制作用于卷积的圆形内核 radius 3 no of pixels to be 1 on either side of the center pixel shall be decimal a
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list

随机推荐

  • 使用 Jackson 将 Java 对象序列化为 JSON 时抑制包装器对象

    我有一个以 JSON 形式返回列表的 Web 服务 它使用 Jackson 将 Java POJO 列表映射到 JSON 问题是 JSON 表示在数组周围有一个包装对象 而我只想要该数组 即 我得到这个 optionDtoList 当我真正
  • Hadoop JobConf 类已弃用,需要更新示例

    我正在编写 hadoop 程序 我真的不想使用已弃用的类 在网上的任何地方我都找不到更新的程序 org apache hadoop conf 配置 班级 代替 org apache hadoop mapred JobConf class p
  • 无法生成类,因为找不到具有复杂类型的顶级元素

    我正在尝试使用 XSD EXE 工具从 xsd 文件创建一个类 但由于某种原因我收到此错误 警告 无法生成类 因为没有顶级元素 发现复杂类型 我环视了堆栈 发现我可以在复杂类型元素上放置一个类型 但我似乎无法让我工作 这是 xsd 文件
  • 使用应用函子 |@| 进行 Scalaz 验证不工作

    我正在尝试在我的应用程序中使用 Scalaz 7 Validation 但是 我在获取时遇到问题 应用函子来合并我的失败 这是我的代码 type ValidationResult ValidationNel String Unit def
  • 具有连续彩虹色的热图

    首先 我不得不说 我在 stackoverflow 和其他地方读到了很多关于 heatmap 和 ggplot2 的帖子 但我的问题还没有解决 我有以下数据集 Var1 Var2 value 1 197 5 197 5 0 2 192 5
  • 使用 Google OAuth API 检索出生日期

    有谁知道如何通过 Google OAuth api 检索 D O B 我可以通过将范围设置为来获取其他信息 例如姓名 电子邮件 性别https www googleapis com auth userinfo profile 但我无法用这个
  • Python 子进程模块不会在段错误上返回标准输出

    我正在从 Python 运行 C 可执行文件 该可执行文件有时会出现段错误 当出现段错误时 子进程模块不会在 stdout 或 stderr 中返回任何内容 示例代码 import subprocess proc subprocess Po
  • Python:所有子进程调用上的“FileNotFoundError”

    使用 Windows 7 Python 3 5 1 import subprocess subprocess check output echo hello 引发错误 Traceback most recent call last File
  • Android 应用程序中的动态 ListView

    是否有一个工作示例演示如何在 ListView 中动态追加附加行 例如 您正在从中提取 RSS 提要 不同领域 然后显示前 10 项 在 ListView 中 当你有 中运行的其他线程 后台继续拉动提要 你滚动并到达底部 列表并单击按钮 查
  • java换行符

    我想知道为什么我没有得到预期的结果 String t 1302248663033 t replaceAll n System out println t 输出是 1302248663033 所以我想知道为什么 n仍然在那里 有人知道吗 n
  • 数组和指针之间的区别[重复]

    这个问题在这里已经有答案了 昨天我在使用自制的 strcpy 函数时遇到了一些麻烦 虽然现在可以了 但我有点困惑 char a Hello World Works char b Hello World Works also strcpy a
  • 如何在 C++ 中快速安全地从文本文件中读取超长行?

    有一个 6 53 GiB 的大文本文件 它的每一行可以是数据行或注释行 注释行通常很短 少于 80 个字符 而数据行包含超过 200 万个字符 并且长度可变 考虑到每个数据行都需要作为一个单元来处理 是否有一种简单的方法可以在 C 中安全快
  • Matplotlib坐标变换

    我试图理解这段代码片段 def add inset ax rect args kwargs box ax get position inax position ax transAxes transform rect 0 2 infig po
  • 如何清除内存缓存?

    我使用 MemoryCache 类创建了一个缓存 我向其中添加了一些项目 但是当我需要重新加载缓存时 我想先清除它 最快的方法是什么 我应该遍历所有项目并一次删除它们还是有更好的方法 Dispose现有的 MemoryCache 并创建一个
  • 如何使用mysql将视频存储在数据库中?

    我尝试使用 MySQL 将视频文件存储到数据库中 但我不知道如何存储 视频文件存入数据库 我尝试执行以下查询 但没有成功 CREATE TABLE GAME GAME ID INTEGER NOT NULL PRIMARY KEY GAME
  • Javascript:获取当前页面当前源

    我有 HTML 我需要获取该 html 的页面源 document documentElement outerHTML or ajax async true type GET cache false url window location
  • 以编程方式设置控制台窗口大小和位置

    我想在桌面上打开多个控制台程序 这是我每次都必须做的事情 1 右键单击桌面 gt 屏幕分辨率 gt 检测 4个显示器 2 打开 16 个不同的控制台程序 每个屏幕 4 个 3 单击所有窗口以获得正确的 Z 顺序 3 右键单击任务栏 gt 显
  • 获取访问您网站的每个用户的 IP 地址和位置

    如何通过 Asp Net 获取您网站的每个网站访问者的 IP 地址和位置 Thanks 要获取用户的IP 请使用 Request UserHostAddress 您可以使用此网络服务来获取他们的地理位置 http iplocationtoo
  • 返回字符串行号的查找命令

    我有一堆文件组织成目录 所有这些都是文本文件 c c 我正在尝试理解这段代码 我需要查看许多变量的声明 如何使用 find 命令在 ubuntu linux 中使用 Find 命令获取确切位置 带行号的文件名 或者有没有任何图形工具可以做同
  • 最终减少的策略

    我正在尝试实现一个 OpenCL 版本来减少浮点数组 为了实现这一目标 我采用了在网上找到的以下代码片段 kernel void sumGPU global const double input global double partialS