阳光开朗男孩
躺平才是王道
展开
-
OpenCL编程快速入门
3.利用clGetDeviceInfo和clGetPlatform和clGetDeviceInfo获得硬件的参数信息。7.在host创建Buffer,利用MapBUffer将数据从内存映射出来。9.创建GPU显存,利用MapBuffer将数据从=显存中映射出来。5.创建context,绑定对应的device,platform。10.利用WriteBuffer,将host中的数据写入显存。2.根据不同的platform获得不同的device。8.对内存上的数据进行初始化。12.释放opencl资源。原创 2023-12-26 15:22:23 · 405 阅读 · 0 评论 -
OpenCL编程指南-11.1OpenCL嵌入式简档
OpenCL规范定义了两个简档:一个是面向桌面设备的简档(完全简档),另一个是面向手持设备和嵌入式设备的简档(嵌入式简档)。手持和嵌入式设备在屏幕大小和电源方面存在很大限制,需要对完全简档中定义的需求有所放宽。嵌入式简档的着眼点是完全简档所需的OpenCL 1.1规范的一个严格子集。嵌入式简档作为完全简档的一个严格子集,有以下好处:1)可以为两个简档提供一个规范,而不需要单独的规范。2)为嵌入式简档编写的OpenCL程序可以在实现完全简档的设备上运行。原创 2023-09-15 16:32:50 · 246 阅读 · 0 评论 -
OpenCL编程指南-10.2使用C++包装器API的矢量相加示例
乍一看可能会让你有些害怕,因为这里使用了一种称为特征类(traits)的C++模板技术(这里用于关联clGetXXInfo()提供的共享功能),不过,由于使用这些getInfo()函数的程序在实际中从来不需要引用特征类组件,所以对于开发人员编写的代码没有任何影响。这些缓冲区对象使用cl::Buffer()创建。对于局部工作大小,使用cl::Range()对象的一个特殊实例cl::NullRange,顾名思义,它对应于C API中传递NULL,允许运行时为设备确定最佳的工作组大小和请求的全局工作大小。原创 2023-09-07 16:11:57 · 447 阅读 · 0 评论 -
OpenCL编程指南-10.1C++包装器API
C++API划分为多个类,分别映射到一个OpenCL C类型,例如,cl::Memory类就映射到OpenCL C中的cl_mem。不过,C++ API会尽可能使用继承提供额外的一层类型抽象;例如,类cl::Buffer派生自基类cl::Memory,表示所有可能的OpenCL内存对象的1维内存子类。类层次体系结构见图12-1。一般地,C++类类型到底层OpenCL C类型有直接的映射,在这种情况下,底层C类型可以通过操作符()访问。//not safe。原创 2023-09-07 11:39:34 · 337 阅读 · 0 评论 -
OpenCL编程指南-9.3使用事件完成评测、内核中的事件、OpenCL外部的事件
所以我们完成一个异步复制,将B的一列从全局内存复制到局部内存(使得所有工作项都能使用相同的列),之后再将A的一行复制到私有内存(这里,计算乘积矩阵C的各个元素时工作项可以反复使用这一行)。换句话说,连接OpenCL和OpenGL的命令定义为:在最常见的需要同步的情况下,这些命令会自动执行。要实现这个方法,将A的行与B的列相乘的for循环必须等待,直到异步复制完成。因此,在理想情况下,任何对象如果能够表示为队列中的命令,就应当提供一个事件接口。评测将事件转换为一个包含计时数据的不透明的对象。原创 2023-09-06 18:29:30 · 141 阅读 · 0 评论 -
OpenCL编程指南-9.2事件对象、宿主机上生成事件、影响宿主机上执行的事件
不过,事件不能跨上下文。跨上下文边界时,只有一种选择,就是让宿主机程序等待一个上下文的事件,然后使用用户事件来触发另一个上下文中命令的执行。换句话说,如果为一个事件注册了多个回调,那么一旦这个事件将其状态切换为CL_COMPLETE,所注册的回调函数可能会按任意的顺序执行。也就是说,即使这个函数确定由事件标记的一个命令已经执行完毕(即CL_EVENT_COMMAND_EXECUTION_STATUS返回CL_COMPLETE),也不能保证与该事件关联的命令所修改的内存对象对于队列中的其他命令可见。原创 2023-08-29 18:56:34 · 175 阅读 · 0 评论 -
OpenCL编程指南-9.1命令、队列、事件
命令队列是OpenCL的核心。平台定义了一个上下文,其中包含一个或多个计算设备。每个计算设备可以有一个或多个命令队列。提交到这些队列的命令将完成OpenCL程序的具体工作。在一个简单的OpenCL程序中,提交到一个命令队列的命令会按顺序执行。一个命令完成后,下一个命令才能开始,程序会展开为一个有严格顺序的命令序列。各个命令存在大量并发性时,这种有序方法能够提供应用程序所需要的性能。不过,实际的应用程序通常并没有这么简单。大多数情况下,应用程序不需要严格有序地执行命令。原创 2023-08-04 18:09:59 · 338 阅读 · 0 评论 -
OpenCL编程指南-8图像和采集器
mem_flags设置为CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,这会从宿主机指针复制数据,并把它存储在一个2维图像对象中,在内核中这个2维图像对象是只读的。如果我们很清楚图像肯定是某个值的倍数,也可以不要这个测试,不过编写这个例子是为了处理任意的图像大小,所以我们在内核中完成了这个测试,以确保读、写操作不会超出图像大小范围。坐标指定为非规格化,这说明x坐标将是[0,width - 1]范围内的一个整数,y坐标是范围[0,height - 1]内的一个整数。原创 2023-08-01 19:14:49 · 565 阅读 · 1 评论 -
Windows下FreeImage库的配置
解压后,打开FreeImage.2017.sln,如果是vs2019自动升级即可,并编译Debug x64。把FreeImaged.lib引入到需要的解决方案里面。找到FreeImage.h的位置引入到解决方案里面。首先下载FreeImage库,原创 2023-08-01 15:58:22 · 765 阅读 · 0 评论 -
OpenCL编程指南-7缓冲区和子缓冲区
OpenCL内存对象的分配对应于一个上下文,这个上下文可能有一个或多个相关联的设备。内存对象对这个上下文中的所有设备都是全局可见的。不过,由于OpenCL定义了一个宽松的内存模型,所以对一个内存对象的所有写操作并非对同一个缓冲区的后续读操作都可见。通过观察可以明确这一点,与其他设备命令类似,读、写内存对象时将把一个与特定设备相关的命令入队。原创 2023-07-03 19:04:37 · 346 阅读 · 0 评论 -
OpenCL编程指南-6.3内核对象
在这种情况下,第一个参数索引为0,传入一个cl_mem对象的指针,因为这是一个全局指针。例如,给定HelloBinaryWorld示例中hello_kernel(),参数a的索引为0,参数b的索引为1,参数result的索引为2。关于内核对象的释放要考虑一个重要的问题,与一个程序对象关联的所有内核对象都释放之前,这个程序对象不能重新构建。2)除了性能方面的原因,实际上,应用程序通常并不需要在宿主机上的不同线程中为同一个内核对象设置内核参数,很难找到这样做的理由。在改变之前,内核对象上设置的参数是持久的。原创 2023-06-30 18:59:13 · 369 阅读 · 0 评论 -
OpenCL编程指南-6.2程序对象
调用clBuildProgram()会为指定的所有设备构建程序对象(或者,如果没有指定设备列表,则为与上下文关联的所有设备构建程序对象)。否则,会返回一个错误码。要创建程序对象,可以传入OpenCL C源代码文本,或者利用程序二进制码来创建。OpenCL C程序的源代码放在一个外部文件中(例如,就像我们的示例代码中的.cl文件),应用程序将使用clcreateProgramwithsource()函数由源代码创建程序对象,另一种做法是由为设备预编译的二进制码创建程序对象,这个方法将在后面讨论。原创 2023-06-25 19:50:58 · 560 阅读 · 0 评论 -
OpenCL编程指南-6.1程序和内核对象概述
OpenCL 中两个最重要的对象就是内核对象和程序对象。OpenCL应用将设备上并行执行的函数表述为内核。内核用OpenCL C语言(参见第4章)编写,由_kernel限定符指示。为了向内核函数传递参数,应用必须创建一个内核对象。内核对象可以使用API函数处理,允许设置内核参数以及查询内核信息。内核对象由程序对象创建。程序对象包含程序源代码中定义的内核函数集合。程序对象的主要作用之一是便于为程序关联的设备编译内核。另外,程序对象还有利于确定构建错误和查询程序信息。原创 2023-06-25 18:50:49 · 160 阅读 · 0 评论 -
OpenCL编程指南-5.5图像读、写函数
get_image_channel_data_type和get_image_channelorder返回的值使用了一个CLK_前缀。有 CLK_前缀的值与clcreateImage2D和clCreateImage3D的cl_image_format参数中image_channel_order和image_channel_data_type域指定的相应CL_前缀存在一一映射。从相同图像读取时,为read_imagef、read_imagei或read_imageui 指定的采样器必须使用相同的规格化坐标值。原创 2023-06-25 18:44:09 · 480 阅读 · 0 评论 -
OpenCL编程指南-5.4原子函数和杂项矢量函数
使用泛型类型名gentype指示函数可以取 char、uchar、short、ushort、int、uint、long、ulong、float 作为参数类型,如果支持双精度扩展,还可以取double作为参数类型。建议使用shuffle和shuffle2完成排列操作,而不要自行编写代码,因为编译器很容易将这些内置函数映射到适当的底层硬件ISA。表5-14描述的OpenCL C内置函数可以对全局或局部内存中的32位有符号和无符号整数以及单精度浮点数提供原子操作。这些会导致一个编译错误。原创 2023-06-25 17:46:53 · 204 阅读 · 0 评论 -
OpenCL编程指南-5.4矢量数据加载和存储函数,同步函数
假设全局工作大小为16个工作项,有两个工作组,分别有8个工作项,如果执行 kernelsmooth,则存储在id[7]和id[8]中的值未确定。这是因为两个工作组中的工作项都使用id[7]和id[ 8]来计算temp。由于不能保证工作组何时执行或者它们会在哪个计算单元上执行,另外由于barrier只能保证一个工作组中的工作项之间的内存一致性,所以无法确定会计算哪个值以及id[7]和ia[8]中会存储哪个值。注意,仅工作组中的工作项之间保证内存一致性,不能保证跨工作组的内存一致性。原创 2023-06-25 16:16:05 · 231 阅读 · 0 评论 -
OpenCL编程指南-5.3几何函数和关系函数
使用泛型类型名sgentype指示有符号整数类型char、char2、char3、char4、char8、char16、short、short2、short3、short4、short8、short16、int、int2、 int3、int4、int8、int16、long、long2、long3、long4、long8或long16。如果支持支持双精度扩展,泛型类型名gentyped指示函数可以取double、double2、double3、double4、double8或double16作为参数类型。原创 2023-06-25 15:37:47 · 316 阅读 · 0 评论 -
OpenCL编程指南-5.2数学函数
除了表5-2中所列的数学函数外,OpenCL C还为单精度浮点标量和矢量数据类型实现了另外两组最常用的数学函数。有_F后缀的常量类型为float,在float类型的精度范围内是精确的。没有_F后缀的常量类型为double,在 double类型的精度范围内是精确的,只有当OpenCL实现支持双精度扩展时才可用。表5-5给出了单精度和双精度浮点基本运算和函数的最大相对误差(定义为ulp,即最后一位的单位数)。表5-5给出了单精度和双精度浮点基本运算和函数的最大相对误差(定义为ulp,即最后一位的单位数)。原创 2023-06-25 14:38:39 · 526 阅读 · 0 评论 -
OpenCL编程指南-5.1工作项函数-整数函数-公共函数
使用泛型类型名gentypef指示函数可以取float、float2、float3、float4、float8或float16作为参数类型,使用泛型类型名gentyped指示函数可以取double、double2、double3、double4、double8或double16作为参数类型。如下描述了OpenCL内核可以调用的一些内置函数,以便得到有关工作项和工作组的信息,如工作项的全局ID和局部ID,以及全局工作大小和局部工作大小。中指定的全局工作大小和局部工作大小。以下是一些可用的宏名。原创 2023-05-18 17:51:08 · 1643 阅读 · 0 评论 -
OpenCL编程指南-4.5关键字-预处理指令-宏-限制
只能指定为一个函数参数的类型,或者指定为程序作用域或内核函数最外层作用域中声明的一个变量的类型。采样器类型不能用来声明结构或联合域、采样器数组、指向采样器的指针,或函数的返回类型。扩展可能影响OpenCL语言的语义或语法,或者为OpenCL语言增加内置函数,每一个这样的扩展还必须创建一个与扩展名字符串相匹配的预处理器。图像类型也不能用来声明变量、结构或联合域、图像数组、指向图像的指针,或函数的返回类型。只能指定为函数参数类型,不能声明为函数中的局部变量,也不能声明为函数的返回类型。事件参数或变量不能修改。原创 2023-05-18 13:20:14 · 306 阅读 · 0 评论 -
OpenCL编程指南-4.4限定符
这个地址空间名用来描述需要在局部内存中分配的变量,这些变量由执行内核的一个工作组(而非跨多个工作组)的所有工作项共享。局部地址空间的指针可以作为函数(包括内核函数)的参数和函数内声明的变量。需要说明的是,局部地址空间中的变量如果作为指针参数传递,或者在一个内核函数内部声明,那么仅在执行这个内核的工作组的生命周期内存在。将一个地址空间中的指针强制转换为另一个不同地址空间中的指针是非法的。内核函数中未用地址空间限定符声明的变量、非内核函数中声明的所有变量,以及所有函数参数都在private地址空间中。原创 2023-05-15 19:45:49 · 561 阅读 · 0 评论 -
OpenCL编程指南-4.3类型转换
除非另外明确说明,否则一般来讲通用真实类型也是结果的相应真实类型,如果操作数相同而且很复杂,那么结果的类型域就是操作数的类型域。矢量类型之间的隐式转换是不允许的;否则,如果只有一个矢量类型,而且所有其他操作数都是标量类型,那么这些标量类型会转换为矢量元素的类型,再宽化为一个新矢量,其中包含原矢量相同数目的元素,这里会把标量值全面复制到这个新矢量。1)如果一个浮点类型可以准确地表示另一个浮点类型中的所有数值,那么第一个浮点类型的等级大于第二个浮点类型(对此,使用浮点值编码,而不是设备可用编码的子集)。原创 2023-05-12 19:07:46 · 814 阅读 · 0 评论 -
OpenCL编程指南-4.2矢量数据类型
矢量字面量的写法如下:首先是一个用括号括起的矢量类型,后面是一个用括号括起的参数列表,各参数之间用逗号分隔。可用的函数形式为可能的参数列表集合,其中所有参数与结果矢量有相同的元素类型,而且元素总数等于结果矢量中元素的个数。另外,还可以采用一种单个标量的形式,该标量的类型要与矢量的元素类型相同。如果一个内置数据类型的大小(字节数)不是2的幂,则要按紧邻的下一个2的幂值对齐(即大于它的最小的2的幂值)。例如,下面的用法是不合法的。)后缀来得到较小的矢量类型,或者把较小的矢量类型结合为一个较大的矢量类型。原创 2023-05-12 16:26:23 · 1039 阅读 · 0 评论 -
OpenCL编程指南-4.1OpenCL C编程
这样还便于编写可移植的矢量代码,因为现在的OpenCL编译器会负责将OpenCL C中的矢量操作映射到设备上适当的矢量ISA。OpenCL C编程语言用来创建描述数据并行内核和任务的程序,这些内核和任务可以在一个或多个异构设备上执行,如 CPU、GPU和另外一些称为加速器的处理器(如DSP和 Cell Broad-band Engine (B.E.)处理器)。不过,应用程序不能直接调用OpenCL内核,只能将内核的执行放在一个为设备创建的命令队列中排队。唯一标识执行内核的工作项列表中的一个工作项。原创 2023-05-12 14:41:32 · 1231 阅读 · 0 评论 -
OpenCL编程指南-3.2OpenCL上下文
例如,内存对象分配有一个上下文,不过可以由特定的设备来更新,OpenCL 的内存保证相同上下文中的所有设备可以在明确定义的同步点看到这些更新。有一点很重要,要认识到尽管通常这些阶段可以构成OpenCL程序的基础,不过完全可以使用多个上下文,分别由不同平台创建,并把工作分布到这些上下文和关联的设备上。区别在于,OpenCL的内存模型不会跨设备,这说明内存对象不能由不同的上下文(可能由相同或不同的平台创建)共享。给定一个平台,下面的例子展示了如何查询GPU设备集,如果有一个或多个设备,还可以创建一个上下文。原创 2023-05-12 09:28:24 · 604 阅读 · 0 评论 -
OpenCL编程指南-3.1OpenCL平台与设备
OpenCL平台在2.1中讨论过,OpenCL应用的第一步是查询OpenCL平台集合,选择其中一个或多个平台在应用中使用。与平台关联有一个简档 (profile),描述所支持的特定OpenCL版本的功能。简档可以是完全简档,涵盖定义为核心规范的所有功能,或者是嵌入式简档,定义为完全简档的一个子集,其中删除了为保证与IEEE754标准一致而提出的一些需求。平台集可以用以下命令查询:extern CL_API_ENTRY cl_int CL_API_CALLclGetPlatformIDs(cl_uin原创 2023-05-11 14:48:40 · 698 阅读 · 0 评论 -
OpenCL编程指南-2.1HelloWorld
一般情况下,程序会迭代查询这些设备的信息,选择其中最好的一个 (或多个) 设备。选择平台并创建一个上下文之后,HelloWorld 应用的下一步要选择一个设备,并创建一个命令队列。要执行OpenCL 计算内核,需要在内存中分配内核函数的参数,以便在OpenCL设备上访问。调用之后,可能并不会在设备上执行内核,而是让内核等待之前的事件完成之后再执行。综上所述,在内核的执行完成之前,不会有读操作,另外,由设备读回结果之前读取操作也不会返回。,这会将数组的内容复制到设备上为内存对象分配的存储空间中。原创 2023-05-10 19:23:35 · 785 阅读 · 0 评论 -
OpenCL编程指南-1.2OpenCL图形API
不过,在异构世界中,如果脱离CPU,那么对浮点算术运算的支持会有更多的选择。另外,OpenCL还定义了一些不透明的类型,例如,支持图像的内存对象。掌握真正要使用的函数。在后面的章节中将会看到,我们重点讨论OpenCL程序员为宿主机程序编写代码时,每个OpenCL应用程序都以类似的方式打开,调用平台API的函数为OpenCL计算定义上下文。综合以上浮点数需求、限制和扩展,就得到了一个非常适合当前异构平台的编程语言,随着这些平台中使用的处理器继续发展,并变得更为通用,OpenCL C编程语言也会随之发展。原创 2023-05-10 17:45:59 · 1106 阅读 · 0 评论 -
OpenCL编程指南-1.2OpenCL基本概念
OpenCL概念基础面向异构平台的应用都必须完成以下步骤:1)发现构成异构系统的组件。2)探查这些组件的特征,使软件能够适应不同硬件单元的特定特性。3)创建将在平台上运行的指令块(内核)。4)建立并管理计算中涉及的内存对象。5)在系统中正确的组件上按正确的顺序执行内核。6)收集最终结果。这些步骤通过OpenCL中的一系列API再加上一个面向内核的编程环境来完成。我们将采用一种“分而治之”的策略解释以上步骤的所有工作。我们把问题分解为以下模型:1)平台模型 (platform model):原创 2023-05-10 17:19:46 · 1579 阅读 · 0 评论 -
OpenCL编程指南-1.1OpenCL简介
OpenCL是面向由CPU、GPU和其他处理器组合构成的计算机进行编程的行业标准框架。这些所谓的 “异构系统” 已经成为一类重要的平台,OpenCL是直接满足这些异构系统需求的第一个行业标准。OpenCL于2008年12月首次发布,早期产品则在2009年秋天才推出,因此OpenCL是一项相当新的技术。利用OpenCL,可以编写一款能够在各类系统上成功运行的程序,这些系统包括移动电话、笔记本电脑,甚至是大规模超计算机中的节点。OpenCL通过公布硬件来提供高度的可移植性,而不是将硬件隐藏在精巧的抽象之下。原创 2023-05-10 14:32:13 · 1356 阅读 · 0 评论 -
GPU理解
GPU(Graphics Processing Unit)代表图形处理单元。该术语通常与图形卡或视频卡等术语互换使用。从技术上讲,GPU 是第三方显卡或主板上的主要图形处理芯片。GPU 与 CPU不同。CPU 是中央处理器,它是计算机的主要大脑。GPU 专用于执行在计算机上渲染图像、视频和动画所需的密集计算。GPU 对于需要大量处理能力的高分辨率视频游戏尤为重要。原创 2023-05-06 15:25:12 · 1087 阅读 · 0 评论 -
windows下安装OpenCL
由于我的电脑是windows10,显卡是集显Intel® UHD Graphics 630。原创 2023-05-05 19:24:36 · 7044 阅读 · 3 评论