c - 基本 GPU 应用,整数计算

标签 c gpu gpgpu

长话短说,我做过几个交互软件的原型(prototype)。我现在使用 pygame(python sdl wrapper),一切都在 CPU 上完成。我现在开始将它移植到 C,同时搜索现有的可能性,以使用一些 GPU 功能来使 CPU 从冗余操作中解脱出来。但是,我找不到一个好的“指南”,在我的情况下我应该选择什么确切的技术/工具。我只是阅读过多的文档,它很快就会耗尽我的精神力量。我不确定这是否可能,所以我很困惑。
在这里,我对我开发的典型应用程序框架做了一个非常粗略的草图,但鉴于它现在使用 GPU(请注意,我对 GPU 编程的实践知识几乎为零)。仍然重要的是必须准确保留数据类型和功能。在这里:
enter image description here

所以 F(A,R,P) 是一些自定义函数,例如元素替换、重复等。函数在程序生命周期中大概是恒定的,矩形的形状通常不等于 A 形状,因此它不在-位计算。所以它们只是用我的函数生成的。 F的例子:重复A的行和列;用替换表中的值替换值;将一些图 block 组合成单个数组; A 值的任何数学函数等。如前所述,所有这些都可以在 CPU 上轻松完成,但应用程序必须非常流畅。顺便说一句,在纯 Python 中,它在添加了几个基于 numpy 数组的视觉功能后变得不可用。 Cython 有助于制作快速的自定义函数,但源代码已经是一种沙拉了。

问题:

  • 此架构是否反射(reflect)了某些(标准)技术/开发工具?

  • CUDA 是我要找的东西吗?如果是,一些与我的应用程序结构重合的链接/示例会很棒。

我知道,这是一个很大的问题,所以如果有帮助,我会提供更多细节。


更新

这是我的位图编辑器原型(prototype)的两个典型计算的具体示例。因此,编辑器使用索引,数据包括具有相应位掩码的层。我可以确定图层的大小,掩码与图层的大小相同,也就是说,所有图层的大小都相同(1024^2 像素 = 4 MB,用于 32 位值)。我的调色板是说,1024 个元素(32 bpp 格式为 4 KB)。
考虑一下我现在想做两件事:

第 1 步。我想将所有图层合二为一。假设 A1 是默认图层(背景),图层“A2”和“A3”具有蒙版“m2”和“m3”。在 python 中我会写:

from numpy import logical_not
...
Result = (A1 * logical_not(m2) + A2 * m2) * logical_not(m3) + A3 * m3

由于数据是独立的,我相信它必须使加速与并行 block 的数量成比例。

第 2 步。现在我有一个数组,想用一些调色板给它“着色”,所以它将成为我的查找表。正如我现在看到的,同时读取查找表元素存在问题。 enter image description here

但我的想法是,也许可以为所有 block 复制调色板,这样每个 block 都可以读取自己的调色板?像这样: enter image description here

最佳答案

当您的代码是高度并行的(即处理阶段之间的数据依赖性很小或没有)时,您可以选择 CUDA(对同步进行更细粒度的控制)或 OpenCL(非常相似且可移植的类似 OpenGL 的 API,以与用于内核处理的 GPU)。我们所做的大部分加速工作都是在 OpenCL 中进行的,它与 OpenGL 和 DirectX 具有出色的互操作性,但我们也有与 CUDA 一起使用的相同设置。 CUDA 和 OpenCL 之间的一大区别是,在 CUDA 中,您可以编译内核一次并在您的应用程序中延迟加载(和/或链接)它们,而在 OpenCL 中,编译器与 OpenCL 驱动程序堆栈配合得很好,以确保在以下情况下编译内核该应用程序启动。

如果您使用的是 Microsoft Visual Studio,一个经常被忽视的替代方案是 C++AMP,这是一个 C++ 语法友好且直观的 API,适用于那些不想深入研究 OpenCL/CUDA API 的逻辑曲折的人.这里的一大优势是,如果您的系统中没有 GPU,代码也可以工作,但是您没有那么多的选项来调整性能。尽管如此,在很多情况下,这是一种快速有效的方式来编写概念代码证明并稍后在 CUDA 或 OpenCL 中重新实现位和部分。

OpenMP 和 Thread Building Blocks 只有在您遇到同步问题和大量数据依赖性时才是不错的选择。使用工作线程的 native 线程也是一个可行的解决方案,但前提是您对如何在不同进程之间设置同步点有一个很好的想法,这样线程在争夺优先级时不会互相饿死。要做到这一点要困难得多,Parallel Studio 等工具是必须的。但是,如果您正在编写 GPU 代码,NVida NSight 也是如此。

附录:

一个名为 Quasar (http://quasar.ugent.be/blog/) 的新平台正在开发中,使您能够使用与 Matlab 非常相似的语法编写数学问题,但完全支持 c/c++/c# 或 java 集成,并交叉-编译(LLVM,CLANG)你的“内核”代码到任何底层硬件配置。它生成 CUDA ptx 文件,或在 openCL 上运行,甚至在使用 TBB 的 CPU 上运行,或它们的混合。使用一些名字,您可以修饰算法,以便底层编译器可以推断类型(您也可以显式使用严格类型),这样您就可以将类型繁重的事情完全留给编译器。公平地说,在撰写本文时,系统仍处于 w.i.p.第一个 OpenCL 编译程序刚刚被测试,但最重要的好处是快速原型(prototype)制作,与优化的 cuda 相比性能几乎相同。

关于c - 基本 GPU 应用,整数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30362092/

相关文章:

c - 如何将大量 uint_8 转换为 C 中的 float 组?

c - "No Output"结果是 C?

c++ - gpu::blur 函数需要更多时间

OpenCL 荒谬的 CL_OUT_OF_RESOURCES

c++ - 改进并行计算的内存布局

c - 释放内存、函数

c - 在没有 malloc、brk 或 mmap 的情况下,BareMetalOS 如何在 Assembly 中分配内存?

openmp - GPU编程

opengl - GLSL/HLSL - 多单行条件语句而不是单 block

windows - 有什么方法可以找出和/或限制 Windows 中进程对 GPU 的使用吗?