zoukankan      html  css  js  c++  java
  • OpenGL实现通用GPU计算概述

    http://blog.csdn.net/zhouxuguang236/article/details/44783553

    可能比较早一点做GPU计算的开发人员会对OpenGL做通用GPU计算,随着GPU计算技术的兴起,越来越多的技术出现,比如OpenCL、CUDA、OpenAcc等,这些都是专门用来做并行计算的标准或者说接口。

           OpenGL用来做通用GPU计算主要是利用纹理存储器在GPU中计算以及把结果取回内存,这大概是OpenGL做通用GPU计算最好的选择。

    大概的流程主要就是先创建OpenGL的环境,接着创建FBO(帧缓存对象)、纹理、设置纹理参数、然后将纹理绑定到帧缓存对象,最后传输数据到纹理,接着用片段着色器对数据进行处理,最后就是取回数据。一个简单的例子如下:

    [cpp] view plain copy
     
    1. #include <stdio.h>  
    2.   
    3. #include <gl/glew.h>  
    4. #include <gl/glut.h>  
    5.   
    6.   
    7. int main(int argc,char** argv)  
    8. {  
    9.     int nWidth = 8;  
    10.     int nHeight = 3;  
    11.     int nSize = nWidth*nHeight;  
    12.   
    13.     //创建输入数据  
    14.     float *pfInput = new float[4*nSize];  
    15.     float *pfOutput = new float[4*nSize];  
    16.     for (int i = 0; i < nSize*4; i ++)  
    17.     {  
    18.         pfInput[i] = i + 1.5;  
    19.     }  
    20.   
    21.     //创建绘制窗口  
    22.     glutInit(&argc,argv);  
    23.     glutCreateWindow("GPGPU");  
    24.     glewInit();  
    25.   
    26.     //创建FBO并绑定  
    27.     GLuint fb;  
    28.     glGenFramebuffersEXT(1,&fb);  
    29.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fb);  
    30.   
    31.     //创建纹理对象并绑定  
    32.     GLuint tex;  
    33.     glGenTextures(1,&tex);  
    34.     glBindTexture(GL_TEXTURE_RECTANGLE_ARB,tex);  
    35.   
    36.     //设置纹理参数  
    37.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_NEAREST);  
    38.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MAG_FILTER,GL_NEAREST);  
    39.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_S,GL_CLAMP);  
    40.     glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_T,GL_CLAMP);  
    41.   
    42.     //将纹理关联到FBO  
    43.     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_RECTANGLE_ARB,tex,0);  
    44.   
    45.     //定义纹理数据单元类型  
    46.     glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,0,GL_RGBA32F_ARB,nWidth,nHeight,0,GL_RGBA,GL_FLOAT,0);  
    47.   
    48.     //将数据传输到纹理缓存  
    49.     glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB,0,0,0,nWidth,nHeight,GL_RGBA,GL_FLOAT,pfInput);  
    50.   
    51.     //读取数据  
    52.     glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);  
    53.     glReadPixels(0,0,nWidth,nHeight,GL_RGBA,GL_FLOAT,pfOutput);  
    54.   
    55.     //打印结果  
    56.     for (int i = 0; i < nSize*4; i ++)  
    57.     {  
    58.         printf("%f %f ",pfInput[i],pfOutput[i]);  
    59.     }  
    60.   
    61.     //清除资源  
    62.     delete []pfInput;  
    63.     delete []pfOutput;  
    64.     glDeleteFramebuffersEXT(1,&fb);  
    65.     glDeleteTextures(1,&tex);  
    66.   
    67.     return 0;  
    68. }  

    上面的例子,什么也没做,只是将数据传输到GPU,然后原封不动传回来,主要是验证作用。其实这个例子就是参考GPGPU编程技术-从GLSL、CUDA到OpenCL这本书上的。

  • 相关阅读:
    如何通过Restful API的方式读取SAP Commerce Cloud的Product图片
    Permute Digits
    Browser
    Jamie and Alarm Snooze
    Perfect Squares
    Color the ball
    Stars
    1086. Tree Traversals Again (25)
    1085. Perfect Sequence (25)
    1083. List Grades (25)
  • 原文地址:https://www.cnblogs.com/jukan/p/7002239.html
Copyright © 2011-2022 走看看