OpenCL 从大型数组中选择/删除点

2023-12-11

我有一个 2M+ 点的数组(计划在适当的时候增加到 20M),我正在通过 OpenCL 运行计算。我想删除落在随机三角形几何形状内的任何点。

如何在 OpenCL 内核进程中执行此操作?

我已经可以:

  • 识别那些落在三角形之外的点(内核中多边形算法中的简单点)

  • 将它们的坐标传递给全局输出数组。

But:

  • openCL 全局输出数组不能是可变的,因此我将其初始化以在大小方面匹配输入点数组

  • 因此,当一个点落入三角形内时,最终输出中会出现 0,0 点

  • 因此,输出数组本身不会导致任何减少。

可以在 openCL 上下文中删除 0,0 点吗?

注:我在 OpenFrameworks 中编码,因此 C++ 实现链接到 .cl 文件


只是大多数点落在原子条件内的情况的另一种选择:

可以有一个本地计数器和本地原子。然后将该原子合并到全局值,可以使用atomic_add()。 Witch 将返回“之前的”全局值。因此,您只需将索引复制到该地址及以上地址即可。

这应该是一个明显的加速,因为线程将在本地同步,并且只在全局同步一次。全局副本可以是并行的,因为地址永远不会重叠。

例如:

__kernel mykernel(__global MyType * global_out, __global int * global_count, _global MyType * global_in){
   int lid = get_local_id(0);
   int lws = get_local_size(0);
   int idx = get_global_id(0);

   __local int local_count;
   __local int global_val;    
   //I am using a local container, but a local array of pointers to global is possible as well
   __local MyType local_out[WG_SIZE]; //Ensure this is higher than your work_group size
   if(lid==0){
      local_count = 0; global_val = -1;
   }
   barrier(CLK_LOCAL_MEM_FENCE);

   //Classify them
   if(global_in[idx] == ....)
       local_out[atomic_inc(local_count)] = global_in[idx];

   barrier(CLK_LOCAL_MEM_FENCE);

   //If not, we are done
   if(local_count > 0){
      //Only the first local ID does the atomic to global
      if(lid == 0)
         global_val = atomic_add(global_count,local_count);

      //Resync all the local workers here
      barrier(CLK_LOCAL_MEM_FENCE);

      //Copy all the data
      for(int i=0; i<local_count; i+=lws)
          global_out[global_val+i] = local_out[i];
   }
}

注意:我没有编译它,但或多或​​少应该可以工作。

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

OpenCL 从大型数组中选择/删除点 的相关文章

  • 在 OpenCL 内核中实现小型查找表的最佳方法是什么

    在我的内核中 需要对一个小查找表 只有 8 个 32 位整数 进行大量随机访问 每个内核都有一个唯一的查找表 下面是内核的简化版本 用于说明如何使用查找表 kernel void some kernel global uint global
  • 何时使用 cudaHostRegister() 和 cudaHostAlloc()? “固定或页面锁定”内存是什么意思? OpenCL 中哪些是等效的?

    我刚刚接触 Nvidia 的 API 有些表达对我来说不太清楚 我想知道是否有人可以帮助我了解何时以及如何以简单的方式使用这些 CUDA 命令 更准确地说 在研究如何通过内核并行执行 例如使用 CUDA 来加速某些应用程序时 在某些时候我面
  • 什么样的工作受益于 OpenCL

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

    我正在尝试构建一个内核来进行并行字符串搜索 为此 我倾向于使用有限状态机 fsm 的转换表位于内核参数状态中 代码 kernel void Find constant char text const int offset const int
  • OpenCL 中的最佳本地/全局工作规模

    我想知道如何在 OpenCL 中为不同设备选择最佳的本地和全局工作大小 AMD NVIDIA INTEL GPU 有什么通用规则吗 我是否应该分析设备的物理构建 多处理器数量 多处理器中的流处理器数量等 这取决于算法 实现吗 因为我看到一些
  • PyOpenCL 中的时间测量

    我正在 FPGA 和 GPU 中使用 PyOpenCL 运行内核 为了测量执行所需的时间 我使用 t1 time event mykernel queue c width c height block size block size d c
  • 计算 OpenCL C 中内核代码的运行时间

    我想测量内核代码在各种设备 即 CPU 和 GPU 上的性能 读取运行时 我写的内核代码是 kernel void dataParallel global int A sleep 10 A 0 2 A 1 3 A 2 5 int pnp p
  • 内存复制速度对比 CPU<->GPU

    我现在正在学习 boost compute openCL 包装库 我的复制过程非常慢 如果我们将 CPU 到 CPU 的复制速度调整为 1 那么 GPU 到 CPU GPU 到 GPU CPU 到 GPU 复制的速度有多快 我不需要精确的数
  • cl::vector 与 std::vector:不同的迭代器行为

    EDIT 添加了 PlasmaHH 建议的带有内存位置的调试输出 我不明白 OpenCL 的 C 绑定中 cl vector 的不同行为 考虑以下代码 Header Top hpp class Top public void setBool
  • OpenCL 动态并行/GPU 生成的线程?

    CUDA 5 刚刚被释放 http nvidianews nvidia com Releases NVIDIA Releases CUDA 5 Making Programming With World s Most Pervasive P
  • 工作组之间的 OpenCL 同步

    是否可以同步 OpenCL 工作组 例如 我有 100 个工作组 每个工作组只有一个项目 不要问我为什么 这是一个例子 我需要对每个工作项设置障碍 以确保所有工作组都会在这 100 个工作组中的每个工作项达到此障碍点后继续 不 你不能 您可
  • OpenCL:头文件的附加目录

    OpenCL 规范中写道5 6 3 构建选项 5 6 3 1 预处理器选项 I dir Add the directory dir to the list of directories to be searched for header f
  • OpenCL 在线编译:从 cl::program 或 cl::kernel 获取程序集

    我正在使用 OpenCL 运行内核基准测试 我知道我可以使用 OpenCL 供应商提供的各种工具离线编译内核 即ioc64 or poclcc 问题是我得到的性能结果无法用这些工具的汇编 OpenCL 运行时开销或类似的来解释 我想看到由我
  • 如何消除 opencl 代码中的 CL_INVALID_PLATFORM 错误?

    使用 OpenCL 进行简单的矩阵乘法 Multiply two matrices A B C include
  • 如何在 Docker 容器内运行 OpenCL + OpenGL?

    目的是在 Docker 容器内运行 OpenCL OpenGL 互操作 应用程序 但我还没有成功 Intro 我有配备 NVidia 显卡的笔记本电脑 因此我认为利用 NVidia Dockerfiles 1 2 将是一个很好的起点 以下
  • OpenCL:在内核中手动引发异常

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

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

    我有一个 OpenCL 程序 对于小问题运行良好 但是当运行较大的问题超过 Nvidia 硬件上运行内核的 8 10 秒时间限制时 虽然我没有将显示器连接到我正在计算的 GPU Nvidia GTX580 上 但一旦内核运行大约 8 10
  • 如何在 C 中将向量参数传递给 OpenCL 内核?

    我在将向量类型 uint8 参数从 C 中的主机代码传递到 OpenCL 内核函数时遇到问题 在主机中 我将数据存储在数组中 cl uint dataArr 8 1 2 3 4 5 6 7 8 我的真实数据不仅仅是 1 8 这只是为了便于解
  • 在内核 OpenCL 中实现 FIFO 的最佳方法

    目标 在 OpenCL 中实现下图所示 OpenCl 内核所需的主要内容是将系数数组和临时数组相乘 然后最后将所有这些值累加为 1 这可能是最耗时的操作 并行性在这里非常有帮助 我正在为内核使用一个辅助函数来执行乘法和加法 我希望这个函数也

随机推荐

  • 分块读取 20GB 文件而不超出我的 RAM - R

    我目前正在尝试读取 20GB 的文件 我只需要该文件的 3 列 我的问题是 我的内存限制为 16 GB 我尝试使用readr并使用该函数以块的形式处理数据read csv chunked and read csv使用skip参数 但它们都超
  • Android 中的自定义 pdf 查看器

    我需要在我的应用程序中有一个自定义的 pdf 查看器 其中我有自己的菜单和所有内容 它不适用于 webview 我尝试将每个页面转换为图像 但我觉得这不是一个好方法 它使我的应用程序变得又大又复杂 有什么方法可以创建自定义 pdf 视图 建
  • 在 JBoss AS 7.1.X 上使用带有 Spring 3.0.X 的 JAX-WS Web 服务

    我在 JBoss AS Final 7 1 1 上使用 Spring 3 0 6 部署 JAX WS Web 服务时遇到一些问题 我尝试了本教程中的两种第一种方法 http www javacodegeeks com 2010 11 jax
  • 如何隐藏页面内容,直到所有图像完全加载?

    我正在尝试优化一个负载严重的网站 我已经重新排序 压缩和缩小了 js 和 css 但最大的问题是图像 该网站包含一些非常重的图像 因此当它开始加载时 内容会在所有图像加载时跳转 我无法手动设置包含图像的 div 的高度 因为它们是用户提交的
  • iPhone 系列设置后,应用商店中的应用程序是否支持 iPad?

    我在 App Store 上有一个应用程序 并且我已多次确保在以下位置选择 iPhone 应用程序 gt 目标 gt 常规 gt 部署信息 gt 设备 gt iPhone 而不是通用或iPad 每次应用程序获得批准时 它仍然显示 支持 iP
  • selenium.common.exceptions.SessionNotCreatedException:消息:无法找到与 GeckoDriver、Selenium 和 Firefox 匹配的功能集

    我用 selenium 和 firefox webdriver 开发了一个 python 脚本 它在我的机器上运行良好 但如果我在另一台机器上执行相同的脚本 则会出现以下错误 Traceback most recent call last
  • ValueError:值必须是周期、字符串、整数或日期时间

    我在使用日期时间时遇到问题 我有一个带有列时间的数据框 print dt time dtypes 它回复 datetime64 ns 现在我想要得到该日期所在月份的天数 dt NB DAYS p Period dt time days in
  • Ajax刷新后如何绑定jQuery Datepicker?

    我有一个 jQuery 日期选择器 它对我来说非常有用 除了当我通过 ajax 刷新内容时 我丢失了日期选择器 据我所知我应该使用 jQueryon 将其绑定到输入 但我似乎找不到将其绑定到的正确事件 第一次有效 但后续刷新时无效 id s
  • Git 在分支之前拆分提交

    假设您有以下历史 D G feature1 1 A B C E F feature1 现在我想将 B 分成两个提交以获得 D G feature1 1 A B1 B2 C E F feature1 你不能只执行 git rebase i 然
  • 将嵌套列表转换为列表[重复]

    这个问题在这里已经有答案了 我有一个简短的问题 我想取消这个嵌套列表的嵌套 mylist lt list a list A 1 B 5 b list C 1 D 2 c list E 1 F 3 预期结果是 gt list a c 1 5
  • JavaFX FXML 参数从控制器 A 传递到 B 并返回

    我想创建一个基于 JavaFX GUI 的控制器 由多个控制器组成 我无法完成的任务是将参数从一个场景传递到另一个场景并返回 或者换句话说 MainController加载SubController的fxml 将对象传递给SubContro
  • 友元和成员二元运算符的消歧

    考虑以下带有二元运算符的类 我使用operator 仅作为示例 struct B template
  • Paypal Checkout 客户端集成对于浏览器来说安全吗?

    我正在开发一个 PHP 应用程序 我想使用 Paypal Checkout 客户端集成作为我网站的支付方式 但是 集成需要将您的 客户端 ID 放入脚本中 该脚本将完全暴露在浏览器的控制台上 可以向公众公开您的客户 ID 吗 截图 实施 另
  • 如何将 Rust 函数作为参数传递?

    我可以将函数作为参数传递吗 如果没有 什么是好的替代方案 我尝试了一些不同的语法 但没有找到正确的语法 我知道我可以这样做 fn example let fun fn value i32 gt i32 fun fun test fun 5i
  • RESTEasy 客户端:重建对象

    我正在使用 RESTEasy 来使用 REST 服务 并且正在尝试使用 Twitter 的搜索 API 所以我创建了这个界面 public interface SimpleClient GET Path search json Produc
  • GeoDataApi.getAutocompletePredictions 不起作用

    我正在构建一个 Android 应用程序 它显示自动完成功能并使用 GeoDataApi getAutocompletePredictions 在谷歌地图中获取自动完成预测 我遵循了这个教程 https github com googles
  • S3 AWS 使用 boto3 访问两个不同帐户存储桶的 IAM 角色和密钥设置

    我有两个不同的帐户 1 帐户一是供应商帐户 他们给了我们 AccessID 和访问密钥 2 我们拥有完全访问权限的帐户 我们需要使用 boto3 Python 3 7 脚本将文件从供应商 S3 存储桶复制到我们的 S3 存储桶 boto3
  • 未声明 android.support.design.widget.CoordinatorLayout

    我正在 Visual Studio 2015 中使用 Xamarin 创建新的 Android 应用程序 我将组件 Android Support Design Library 23 4 0 1 添加到我的项目 组件 中 在我的布局 Mai
  • iOS 6 CoreLocation 不起作用

    我制作了一个位置应用程序 但核心位置不起作用 我在我的 iPhone 上测试了其他 iPhone 应用程序 比如google Earth 一个导航软件 其他应用程序也不起作用 为什么不更新位置 为什么 locationManager did
  • OpenCL 从大型数组中选择/删除点

    我有一个 2M 点的数组 计划在适当的时候增加到 20M 我正在通过 OpenCL 运行计算 我想删除落在随机三角形几何形状内的任何点 如何在 OpenCL 内核进程中执行此操作 我已经可以 识别那些落在三角形之外的点 内核中多边形算法中的