【问题标题】:Is there an one-pass algorithm to determine whether a value is inside an array? [closed]是否有一种一次性算法来确定一个值是否在数组内? [关闭]
【发布时间】:2014-07-20 13:13:39
【问题描述】:

在 CUDA、OpenCL、OpenGL 计算机着色器和 webgl 中,是否可以创建一次性算法,给定一个大数组/缓冲区,如果数组中存在特定值/字节,该算法将返回 true?

【问题讨论】:

  • thrust::find 几乎可以做到这一点(如果找不到,它会返回一个位置或“结束”,但这很容易转换为真/假)。我也相信编写一个执行此操作的 cuda 或 openCL 内核将是微不足道的。您的问题似乎需要一个针对 4 个不同域的答案。
  • @RobertCrovella 最好将同一个问题问 4 次吗?
  • 我觉得这是一个相当广泛的问题。也许有人会知道所有 4 个领域的答案。
  • 您真的想要一个算法存在于四个不同环境(两个并行计算和两个 3D 图形)中的可能性的是/否答案吗?这有丝毫意义吗?
  • 是的,确实如此。从技术上讲,OpenGL 和 webGL 可以用于 GPGPU,例如。我相信他正在寻找可以应用于所有这些技术的统一解决方案。

标签: algorithm opengl cuda webgl opencl


【解决方案1】:

CUDA 和 OpenCL 配备了原子计数器和设计精美的内核,可以轻松解决您的问题。您创建并运行内核,该内核将分发线程以处理多个值,这些值将与您正在搜索的值进行比较,并且可能使用原子计数器来设置它(或者如 Dithermaster 所说,您甚至不必使用 atomic计数器)。

即使是 OpenGL 也可以利用计算着色器功能来解决您的问题,就像上面提到的两种技术一样。

WebGL 没有 write-from-shader 的东西。唯一的方法是实际绘制一些东西。

说,例如,针对您需要的值测试​​某些(纹理采样)值的片段线程。如果是那个值,写白色片段,否则 - 黑色片段。

那么,您或许可以将单点图元渲染到 1x1 画布上。问题是它不会太并行,只会创建几个线程。 (见this

因此,您需要更大的帧缓冲区/画布来写入,以利用更多的并行性。你这样做,创建更大的画布,然后你可以为渲染的帧缓冲区生成最小的 mip 级别,并检查该图像是否不是黑色的。

(四舍五入存在问题,如果帧缓冲区太大,您实际上可能会丢失正结果)

您可以尝试绘制许多点图元,而不是仅使用片段着色器,每个点图元都有要测试的特定值集(数组属性或类似属性),并将测试集的结果传递给片段着色器(通过变化),然后使用片段着色器将结果与其他片段混合。因此,使用顶点着色器来测试一组值,而片段着色器只在一些简单的 1x1 画布上写入混合结果。

希望这会有所帮助。

【讨论】:

  • 啊,谢谢你和@Dithermaster,这些正是我所期待的答案。 WebGL 没有这种从着色器写入的东西有什么原因吗?似乎它过于复杂化了在其他 3 中看起来微不足道的事情。
  • 它基于更古老的技术 OpenGL ES 2.0,它(粗略地说)围绕 OpenGL 2.0。这些版本是为当时的硬件编写的,没有非图形的计算部分。所以这只是 GPGPU 的即兴创作。而且可能是丑陋的。
【解决方案2】:

是的,至少适用于您的 4 个域中的 3 个。

对于 CUDA、OpenCL 和 OpenGL 计算机着色器,您可以编写一个内核,将缓冲区中的单个元素与所需值进行比较,如果它们相同,则将输出缓冲区中的值设置为 1(将缓冲区初始化为 0 )。运行内核后,您可以检查缓冲区中的值。如果是 1 则找到了您想要的值,如果仍为 0 则未找到。您甚至不需要对结果缓冲区进行原子访问,因为是否有比赛来设置它并不重要;任何人都可以赢。

我不了解 WebGL,因此无法回答该域的问题。

【讨论】:

    【解决方案3】:

    如果数组已排序,则二进制搜索将是 O(log(n)) 解决方案。如果数组未排序,线性搜索将是一个 O(n) 解决方案。

    【讨论】:

    • 这个问题是关于 GPU 计算,而不是 CPU。
    • @Viclib:WebGL 是一个用于 Web 浏览器的 javascript API,而 OpenGL 和 OpenCL 是完全与硬件无关的 API。只有 CUDA(目前无论如何)专门与 GPU 相关联。你真的想在这里问什么??
    • 所有这些都是与 GPU 接口的 API,可用于相同类型的计算。
    猜你喜欢
    • 2013-06-25
    • 2010-11-17
    • 2023-01-12
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多