我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 指令队列 >

OpenCL是什么查了半天没看懂能简单明了的告诉我是干什么的有功能

归档日期:06-28       文本归类:指令队列      文章编辑:爱尚语录

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  OpenCL是GPU通用运算API。是显卡作通用浮点运算的API。比如视频转码,原来这个工作都是CPU来做的。现在显卡运算能力比较强,这个工作完全可以交给显卡来做。

  要调用显卡,这个工作不需要再由程序员考虑了,因为已经有一个现成的接口了,程序员只要管好转码的算法,然后直接调用OpenCL中现成的指令,这个工作就自动由CPU转交到GPU了。

  OpenCL是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器形成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。

  OpenCL类似于另外两个开放的工业标准OpenGL和OpenAL,这两个标准分别用于三维图形和计算机音频方面。OpenCL扩展了GPU用于图形生成之外的能力。OpenCL由非盈利性技术组织Khronos Group掌管。

  API之主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。

  应用程序接口(英语:Application ProgrammingInterface,简称:API),又称为应用编程接口,就是软件系统不同组成部分衔接的约定。由于近年来软件的规模日益庞大,常常需要把复杂的系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。[1]

  全称Open Computing Language,开放运算语言,是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境。

  用于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码。

  广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。

  你可以这样理解,把写程序当成做饭,你需要做蛋炒饭,OpenCL就相当于鸡蛋,炒饭。你不必把母鸡养大,然后等它下蛋,你也不必去种地,等大米成熟。无论你想做蛋炒饭,西红柿炒鸡蛋,直接拿来用就好了。

  程序员在写程序时,会遇见写重复代码的情况,一段代码比较常见,需要经常用到它,那就把它单独拿出来,用的时候,直接放进去就好了,不用再重新写,大大减少了工作量。

  在这里汇总一些OpenCL的基本概念,包括设备、核函数、主机、平台等,把这些概念跟CUDA类比,理解起来就很容易了。

  核函数(Kernel): 是在设备程序上执行运算的入口函数,在主机上调用。

  SIMT(Single Instruction Multi Thread): 单指令多线程,GPU并行运算的主要方式,很多个多线程同时执行相同的运算指令,当然可能每个线程的数据有所不同,但执行的操作一致。

  工作项(Work-item): 跟CUDA中的线程(Threads)是同一个概念,N多个工作项(线程)执行同样的核函数,每个Work-item都有一个唯一固定的ID号,一般通过这个ID号来区分需要处理的数据。

  工作组(Work-group):跟CUDA中的线程块(Block)是同一个概念,N多个工作项组成一个工作组,Work-group内的这些Work-item之间可以通信和协作。

  品台(Platform): 主机和OpenCL管理框架下的若干个设备构成了一个品台,所有GPU操作都限定这这个选择的Platform上运行。OpenCL编程的第一步就是选择并初始化一个平台。

  上下文(Context): 定义了整个OpenCL的运行环境,包括Kernel、Device、内存管理和指令队列等。

  指令队列(Command-Queue): 一些需要在设备上执行的OpenCL指令的集合。

  比如编写一个程序,其中有一个步骤要将运算的内容输出到打印机上。那么为了这个步骤,得写一大堆程序,包括如何调用打印机的驱动,为硬件分配I/O地址等等。相当繁锁。

  OK,现在这个程序写好了,要开发第二个程序了。结果发现,第二个程序中,也有一个步骤是要把内容打印出来的。那么就没必要再把程序重新写一遍了,直接把第一个程序中这个函数复制过来就好了。

  久而久之,大家干脆把一些常用的函数给独立出来,就是API。这样,所有软件,无论是WORD、WPS、PHOTOSHOP还是其他软件,都不需要费事单独去写这段代码了,直接从API里调用就好。这样一来,不仅开发过程简化了,程序本身也更精练了。

  那么OpenGL或DirectX是什么呢?是负责3D图形处理的API,包括各种光照、纹理、烟雾、阴影等效果。程序员在开发游戏的时候,只要考虑什么时候、在哪个位置,加上什么样的烟雾,就可以了。而不必考虑究竟要怎样去编写代码,才能实现烟雾效果的问题。

  OpenCL呢?是显卡作通用浮点运算的API。比如视频转码,原来这个工作都是CPU来做的。现在显卡运算能力比较强,这个工作完全可以交给显卡来做。那究竟怎样调用显卡呢?这个工作不需要再由程序员考虑了,因为已经有一个现成的接口了,程序员只要管好转码的算法,然后直接调用OpenCL中现成的指令,这个工作就自动由CPU转交到GPU了。

  说得有点复杂,也不是很严谨,但大概意思就是这样的,不知道题主看明白了没。

  展开全部做异构计算的。你可以把异构理解为对设备进行抽象。就像我们编程会对类和方法进行封装抽象一样。这个东西可以对设备进行抽象,就是说不管你是gpu啦,cpu啦,还是说你接入了一些fpga、dsp这样的设备;他都可以通过标准化配置,把他们视为一个组(group),然后给其中一个设备分配控制权(通常是cpu来担任此角色),协同一起进行计算。

  也就是说,你用不在意“cpu应该怎么做”、也不用关心“gpu又该怎么做”,更不用在意“如果我想让cpu和gpu‘交火’,他们应该如何协调”。OpenCL帮你搞定这些细节。

  更通俗点讲,就是它为你提供方法组件你的“智囊团”,但你不用过于关心里面成员各自的特性。

  题外话:这东西我记得最早可以说是从OpenGL延伸来的,那个时候CPU的算力有限,一些先驱探索者们,尝试用一些小把戏,通过OpenGL的接口,达到“让它帮我计算,但却不需要渲染图形”的目的。久而久之,这样的需求促使了这个标准的诞生和发展。(不知道有没有记错。。。)所以现在你看到了,我们不仅可以“让GPU帮我计算,但不用渲染”,还可以“让各种不同特性不同风格的设备联合在一起帮我计算”,而你不用关心他们内部如何协作。——如果要让你亲自来协调多种设备高效协作计算,那对开发者而言门槛无疑是很高的;因为光是在一个CPU以外的设备上好好执行计算已经颇有难度了,更别提还有一些开发者可能在CPU上用多线程都会出各种问题。

本文链接:http://ok-panic.net/zhilingduilie/97.html