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

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

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

一个简单的样例例如以下:

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

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

OpenGL实现通用GPU计算概述的更多相关文章

  1. Julia:高性能 GPU 计算的编程语言

    Julia:高性能 GPU 计算的编程语言 0条评论 2017-10-31 18:02    it168网站 原创 作者: 编译|田晓旭 编辑: 田晓旭 [IT168 评论]Julia是一种用于数学计 ...

  2. GPU计算的后CUDA时代-OpenACC(转)

    在西雅图超级计算大会(SC11)上发布了新的基于指令的加速器并行编程标准,既OpenACC.这个开发标准的目的是让更多的编程人员可以用到GPU计算,同时计算结果可以跨加速器使用,甚至能用在多核CPU上 ...

  3. OpenGL研究2.0 计算圆

    OpenGL研究2.0 计算圆 DionysosLai2014-06-18 在游戏中.常常有些地方涉及到一些圆的轨迹计算,例如一些转轴类的游戏,人物一般在角色转轴上面运动.这时,我们就要时刻计算角色的 ...

  4. GPU计算的十大质疑—GPU计算再思考

    http://blog.csdn.NET/babyfacer/article/details/6902985 原文链接:http://www.hpcwire.com/hpcwire/2011-06-0 ...

  5. (Matlab)GPU计算简介,及其与CPU计算性能的比较

    1.GPU与CPU结构上的对比 2.GPU能加速我的应用程序吗? 3.GPU与CPU在计算效率上的对比 4.利用Matlab进行GPU计算的一般流程 5.GPU计算的硬件.软件配置 5.1 硬件及驱动 ...

  6. 多GPU计算

    多GPU计算已经可以说,只要是个成熟的模型,都使用了这一点. 例如: gluoncv:https://github.com/dmlc/gluon-cv/blob/master/scripts/dete ...

  7. OpenCL入门:(二:用GPU计算两个数组和)

    本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl. ...

  8. 从 SPIR-V 到 ISPC:将 GPU 计算转化为 CPU 计算

    游戏行业越来越多地趋向于将计算工作转移到图形处理单元 (GPU) 中,导致引擎和/或工作室需要开发大量 GPU 计算着色器来处理不同的计算任务.但有时候在 CPU 上运行这些计算着色器非常方便,不必重 ...

  9. (一)tensorflow-gpu2.0学习笔记之开篇(cpu和gpu计算速度比较)

    摘要: 1.以动态图形式计算一个简单的加法 2.cpu和gpu计算力比较(包括如何指定cpu和gpu) 3.关于gpu版本的tensorflow安装问题,可以参考另一篇博文:https://www.c ...

随机推荐

  1. 回顾 Exchange 2007 SCC 安装-供需要的人参考!

    最近可能会涉及到一个项目的升级,客户目前是基于SCC+SCR的一种工作模式,因为之前对SCR 了解很少,所以需要搭建一个SCC+SCR 平台来做一个整体的POC,来还原整个安装和升级过程. 首先我们先 ...

  2. fortran中提取字符串中可见字符的索引

    fortran中常常需要提取字符串中可见字符的索引,下面是个小例子: !============================================================= su ...

  3. 样条之贝塞尔(Bezier)

    我曾经发过两篇关于贝塞尔的文章:数学图形(1.47)贝塞尔(Bézier)曲线,数学图形之贝塞尔(Bézier)曲面.那是使用我自己定义的脚本语言生成贝塞尔图形.由于我自己定义的脚本语法功能有限,所以 ...

  4. C++11 std::shared_ptr总结与使用

    最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结.方便后续使用. std::shared_ptr大概总结有以下几点: (1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用 ...

  5. MultipleRegularExpressionAttribute MVC中扩展自定义验证规则

    好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的.这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧 ...

  6. 使用Spring Cloud Security OAuth2搭建授权服务

    阅读数:84139 前言: 本文意在抛砖引玉,帮大家将基本的环境搭起来,具体实战方案还要根据自己的业务需求进行制定.我们最终没有使用Spring Security OAuth2来搭建授权服务,而是完全 ...

  7. Android -- Annotation

    Override Annotation @Override public void onCreate(Bundle savedInstanceState){}; 概念 An annotation is ...

  8. ML、DL相关资源

    1. http://x-algo.cn/index.php/category/nlp/

  9. win7下使用Taste实现协同过滤算法

    如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...

  10. CMake can't find GLEW

      Q: I'm on Windows and there is a FindGLEW.cmake file in my CMake modules folder, presumably put th ...