【问题标题】:Simple GPU programming (with Cg?)简单的 GPU 编程(使用 Cg?)
【发布时间】:2012-03-02 21:03:55
【问题描述】:

我很想知道如何使用 GPU 的并行处理能力。但是,我并不急于制作图形!我尝试了 Cg 的教程,但它似乎很重的图形术语。此外,我似乎无法理解如何将这样的程序连接到某些输入和输出。

让我们考虑以下非常简单的程序,它显然可以从并行性中受益(忽略缓慢的 HDD 速度):从 2 个文件中读取两个大整数数组,通过添加最后两个的元素创建一个新数组,并将其存储在另一个文件中。我没有对其进行测试,但这就是我在 C++ 中编码的方式:

#include <iostream>
#include <fstream>
using namespace std;


int main(void)
{
    const int N=10000000;
    int a[N],b[N],c[N];
    ifstream a_source ("file_a",ios::binary);
    ifstream b_source ("file_a",ios::binary);
    ofstream c_target ("file_a",ios::binary);

    a_source.read((char*)a,N*sizeof(int));
    b_source.read((char*)b,N*sizeof(int));

    for(int i=0;i<N;i++)
        c[i]=a[i]+b[i];

    c_target.write((char*)c,N*sizeof(int));
    return 0;
}

您能否详细说明我如何使用 Cg 来实现这一点?

【问题讨论】:

  • 你对 Cg 死心了吗?据我所知,它纯粹是一种着色器语言,因此不一定适合通用 GPU 编程。看看 CUDA 或 OpenCL。 (警告:您的特定示例当然是一个微不足道的着色器,但我仍然认为使用通用 API 而不是为图形开发的 API 更有意义)。
  • Cg 是图形的 C,而不是 GPU 的 C。如果你想用它做 GPGPU,你需要知道图形处理是如何工作的,以及如何在它上面映射 GPGPU。

标签: c++ gpu gpgpu cg


【解决方案1】:

Cg 确实适用于着色器,最好使用 CUDA,但是如果您对使用 Cg 和片段着色器一无所知,请查看 this 基本示例(基于 2D 网格的计算) .

【讨论】:

  • +1 问题在于 Cg/GLSL 是着色语言,即它们需要用户学习 OpenGL 才能将数据从 PC 的 RAM 传输到 GPU。 OP 应该真正调查隐藏所有这些复杂性的 CUDA。但据我所知,CUDA 仅适用于 NVIDIA 的 GPU。
  • CUDA 仅适用于 nVidia GPU,它的跨 GPU 平台版本是 OpenCL(来自 OpenGL 的制造商)。
  • 我选择 CUDA 只是因为它是像 Cg 一样的 nVidia 产品,并且有很棒的工具和教程 :)
【解决方案2】:

尝试看看 C++ AMP http://blogs.msdn.com/b/vcblog/archive/2011/06/15/introducing-amp.aspx

一般而言,您需要注意,与您需要在代码中投入的额外努力相比,使用双精度时的加速是最小的。这是当您与可以通过编译器开关打开的 6 核 SSE 解决方案进行比较时(并且可能使用英特尔的 VTune 进行性能分析)

【讨论】:

    猜你喜欢
    • 2019-11-21
    • 2010-09-18
    • 2011-11-15
    • 1970-01-01
    • 2011-09-26
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多