C++ 简单的GPU编程(使用Cg?)

C++ 简单的GPU编程(使用Cg?),c++,gpu,gpgpu,cg,C++,Gpu,Gpgpu,Cg,我渴望了解如何使用GPU的并行处理能力。然而,我并不急于使图形!我尝试了Cg教程,但它似乎有大量的图形术语。此外,我似乎无法理解如何将这样一个程序连接到一些输入和输出 让我们考虑下面一个非常简单的程序,它显然受益于并行性(忽略慢速HDD速度):从2个文件中读取两个大整数数组,通过添加最后两个元素来创建一个新数组,并将其存储在另一个文件中。我没有测试它,但我会用c++编写代码: #include <iostream> #include <fstream> using nam

我渴望了解如何使用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;
}
#包括
#包括
使用名称空间std;
内部主(空)
{
常数整数N=10000000;
int a[N],b[N],c[N];
ifstream a_source(“file_a”,ios::binary);
ifstream b_source(“file_a”,ios::binary);
流c_目标(“文件a”,ios::二进制文件);
a_source.read((char*)a,N*sizeof(int));
b_source.read((char*)b,N*sizeof(int));

对于(int i=0;i 实际上是着色器),最好使用,但是如果你死心地使用C++的片段着色器,看看基本的例子(2D网格计算)。
一般来说,您需要注意,与需要在代码中投入的额外精力相比,使用双精度时的加速比是最小的。这是指与可通过编译器开关打开的6核SSE解决方案相比(并且mauybe使用Intel提供的VTune进行性能分析)

你对Cg一窍不通吗?据我所知,Cg纯粹是一种着色器语言,因此不一定适合通用GPU编程。请看一下CUDA或OpenCL。(注意:您的特定示例当然是一个微不足道的着色器,但我仍然认为使用通用API而不是为图形开发的API更有意义).Cg是用于图形的C,而不是用于GPU的C。如果你想用它来做GPGPU,你需要知道图形处理是如何工作的,以及如何在GPU上映射GPGPU。+1问题是Cg/GLSL是着色语言,也就是说,它们要求用户学习OpenGL,以便能够将数据从PC的RAM传输到GPU。OP应该真正调查CUDA which隐藏了所有这些复杂性。但据我记忆所及,CUDA仅在NVIDIA的GPU上可用。CUDA仅适用于NVIDIA GPU,它的跨GPU平台版本是OpenCL(来自OpenGL的制造商)。我选择CUDA只是因为它是NVIDIA的产品,如Cg,并且有很棒的工具和教程:)