糖果派对官方网站_可以赌钱的糖果游戏_手机版
CUDA入门

CUDA入门

作者:操作系统    来源:未知    发布时间:2020-02-05 13:58    浏览量:

纹理一词来源于GPU图形世界,相对于其余标准CUDA类型,纹理的眼观六路更差点。纹理必得表明为一定类型,比如,在编写翻译时宣称为各样对齐类型中的风流倜傥种(u8,u16,u32,s8,s16,s32卡塔尔,其值在运营时表明实施。对于GPU内核来说,纹理内部存储器是只读内部存款和储蓄器,并且唯有通过极度的纹路API与纹理数组边界能力对其访问。平日,纹理在估测计算工夫为1.x的配备上使用的超多。由于纹理的接收极度特别,有的时候费用一如期期去打听API,然后用其编制程序不值得。借使想查看其API的运用,可以参见对于纹理内部存款和储蓄器,唯有在程序真的必要的时候对其张开了然,大家的首要性精力应该献身精晓精通全局内部存款和储蓄器,分享内以至贮存器的应用上。

本文书档案陈述了在iOS上应用OpenGL ES 3.0新扩充的Transform Feedback功用只在终点着色器中贯彻图像管理等通用GPU总计功效。分别于OpenGL ES 2.0将图像处清理计算法写在有些着色器,最终输出到离线纹理、渲染缓冲区或显示屏中,Transform Feedback能够只用极端着色器完毕所需的算法,故不常也被叫做极点调换。

CUDA是什么

目录:|- 达成图像比较度调度|- 读取GPU处理的结果图像|-- 映射GPU内存|-- LX570GBA原始数据创造UIImage|- 生成纹理坐标|- 坑|-- 使用整数采集样本器isampler2D轻松并发的精度难题|-- 使用整数采样器isampler2D轻松现身的纹路坐标难题|- 质量比较

CUDA,Compute Unified Device Architecture的简单称谓,是由NVIDIA公司创造的依照他们公司生产的图样微处理器GPUs(Graphics Processing Units,可以开始的精晓为显卡)的三个并行总计平台和编制程序模型。

作者已编纂的Transform Feedback相关文书档案:

透过CUDA,GPUs能够十分低价地被用来进展通用总结(有一点像在CPU中张开的数值计算等等)。在尚未CUDA此前,GPUs平日只用来打开图纸渲染(如通过OpenGL,DirectX)。

  • iOS GPGPU 编制程序:GPU进行浮点总计并读取结果 详细描述了iOS上运用Transform Feedback的共同体流程。
  • NDK OpenGL ES 3 编写翻译C/C++可履行文书陈说了NDK了配备OpenGL ES 3.0及以上版本开荒际遇并C++可施行文书,Android上进行通用GPU总结可参照此文书档案。
  • iOS GPGPU 编程:化解苹果开拓者论坛的求助帖(Transform Feedback doesn't write, crashes) 消除提问者代码中留存的内部存储器映射空间尺寸错误引致映射退步。
  • iOS GPGPU 编制程序:Transform Feedback完成图像比较度调治介绍读取极点着色器处理后的图像数据并生成UIImage的切实可行贯彻。

开拓人士能够由此调用CUDA的API,来扩充相互影响编制程序,达到高品质总计指标。NVIDIA公司为了抓住更加多的开辟职员,对CUDA实行了编制程序语言扩张,如CUDA C/C++,CUDA Fortran语言。注意CUDA C/C++能够看成三个新的编制程序语言,因为NVIDIA配置了相应的编写翻译器nvcc,CUDA Fortran同样。愈来愈多新闻方可参照他事他说加以考查文献。

据书上说前边所写的iOS GPGPU 编制程序:GPU进行浮点计算并读取结果,今后探求调度图像比较度的总结达成及读取管理结果至主存并生成UIImage实例。下边是本文书档案对应程序的运作结果示例。

注重概念与名称

图片 1原图图片 2纠正相比较度

主机

勤俭节约达成如下所示。

将CPU及系统的内部存款和储蓄器(内部存款和储蓄器条)称为主机。

#version 300 eslayout(location = 0) in vec2 in_texcoord;uniform sampler2D u_sampler;uniform float u_image_width;uniform float u_image_height;uniform float u_contrast_adjustment; // 默认为0.5flat out uint out_color;void main(){ vec2 normalized_texcoord = vec2( in_texcoord.x / u_image_width, in_texcoord.y / u_image_height); vec3 rgb = texture(u_sampler, normalized_texcoord).rgb; vec3 contrast = vec3(0.0, 0.0, 0.0); vec3 normalized_rgb = vec3(mix(contrast, rgb, u_contrast_adjustment)); out_color = (255u << 24) + (uint(normalized_rgb.b * 255.0) << 16) + (uint(normalized_rgb.g * 255.0) << 8) + (uint(normalized_rgb.r * 255.0) << 0);}

设备

简短解析上述代码:

将GPU及GPU自己的来得内部存款和储蓄器称为设备。

  1. 点名输出变量out_color为flat表示不对结果开展插值,进而保险main函数的管理结果。
  2. u_image_width、u_image_height由客商端钦赐要求管理的图像维度,由于前边上传的纹理坐标是[0, 图像宽高],而OpenGL ES定义的纹路坐标范围为[0, 1.0],由此开展归后生可畏化管理。

线程(Thread)

貌似经过GPU的一个核查行拍卖。(能够象征成意气风发维,二维,三个维度,具体上面再细说)。

vec2 normalized_texcoord = vec2( in_texcoord.x / u_image_width, in_texcoord.y / u_image_height);

线程块(Block)

  1. mix函数达成了相比度调治。mix函数的效劳对contrast和rgb多个参数,根据u_contrast_adjustment的值进行线性插值,最后将contrast与rgb所表示的八个颜色混合到一块儿。若是mix函数的第七个参数为第2个参数的阿尔法值,那时候,总结结果相当于调用glBlendFunc函数。

1. 由四个线程组成(能够象征成大器晚成维,二维,三个维度,具体上面再细说)。

2. 各block是并行实施的,block间不能通讯,也尚未试行顺序。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

3. 留意线程块的数码节制为不当先65535(硬件限定)。

  1. 将总结结果映射回[0, 255]限定,后续在CPU上创建UIImage。不像Fragment Shader那样使用vec4的缘故是,CGImage要求叁10个人(4重量、每分量一字节)的多寡格式,而vec4是4个浮点数据,还得做多少截断,多出了专门的学业量。抵补:根据对图像数据的更加的理解,图像的PRADOGB值也可定义为浮点数,具体操作办法随后增添。

线程格(Grid)

介怀,OpenGL ES 3.0极点着色器中不容许内定统生龙活虎变量和出口变量的布局修饰符,下边包车型客车写法将引致编写翻译失败。

由多少个线程块组成(可以象征成意气风发维,二维,三个维度,具体上边再细说)。

layout(location = 0) uniform sampler2D u_sampler;layout(location = 0) out vec4 out_color;

线程束

唯独,在有的着色器中,钦赐输出变量的构造修饰符是法定的。

在CUDA构造中,线程束是指五个包罗三十五个线程的成团,这些线程会集被“编织在协同”而且“爱好一样”的样式进行。在前后相继中的每生龙活虎行,线程束中的每一个线程都将要差别数量上奉行同大器晚成的指令。

读取顶点着色器输出的图像数据的历程略为波折,由于图像奥迪Q5GB数据常常是多方面存款和储蓄,而iOS是小端,故最后输出时得作些额外操作。

核函数(Kernel)

2.1、映射GPU内存

图像操作的结果数据在GPU内部存储器中,而生成UIImage得在CPU上运转,由此一定要举行内部存款和储蓄器映射。依照老外的传教,iOS设备接纳统意气风发内部存款和储蓄器模型(Uniform Memory Model),那么数量不像PC相似在主存和显存中拷贝,而是整个放置于主存中。

GLuint *mappedBuffer = glMapBufferRange(GL_ARRAY_BUFFER, 0, imagePixels * sizeof, GL_MAP_READ_BIT);

此地映射的数据类型和着色器代码中输出的数据类型保持大器晚成致,制止读写越界错误。

1. 在GPU上执行的函数平时号称核函数。

2.2、KoleosGBA原始数据创设UIImage

此间参照他事他说加以考察作者另一个文档iOS OpenGL ES 3.0 数据可视化 4:纹理映射完毕2维图像与录像渲染简单介绍描述的ENVISIONGBA祼数据成立UIImage的措施,差别是前边绘制时没利用极限数据,所以纹理是一点一滴按原图像实行采集样板,不设有结果图像倒转难题,由此删除了扭转代码。

CGContextTranslateCTM(context, 0.0, renderTargetHeight);CGContextScaleCTM(context, 1.0, -1.0);

总体兑现如下所示。

int renderTargetSize = imagePixels * 4;int renderTargetWidth = imageWidth;int renderTargetHeight = imageHeight;int rowSize = renderTargetWidth * 4;CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, mappedBuffer, renderTargetSize, NULL);CGImageRef iref = CGImageCreate(renderTargetWidth, renderTargetHeight, 8, 32, rowSize, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast | kCGBitmapByteOrderDefault, ref, NULL, true, kCGRenderingIntentDefault);uint8_t* contextBuffer = malloc(renderTargetSize);memset(contextBuffer, 0, renderTargetSize);CGContextRef context = CGBitmapContextCreate(contextBuffer, renderTargetWidth, renderTargetHeight, 8, rowSize, CGImageGetColorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big);CGContextDrawImage(context, CGRectMake(0.0, 0.0, renderTargetWidth, renderTargetHeight), iref);CGImageRef outputRef = CGBitmapContextCreateImage;UIImage* image = [[UIImage alloc] initWithCGImage:outputRef];CGImageRelease(outputRef);CGContextRelease;CGImageRelease;CGDataProviderRelease;free(contextBuffer);

出于编制程序方便起见,定义纹理坐标布局体。

typedef struct { GLushort s, t;} TextureCoodinate;

凭仗图像维度音讯生成纹理坐标。

int imagePixels =  (image.size.width * image.size.height);TextureCoodinate *texcoods = calloc(imagePixels, sizeof(TextureCoodinate));int index = 0;for (int line = 0; line < image.size.height; ++line) { for (int col = 0; col < image.size.width; ++col) { TextureCoodinate *t = &texcoods[index]; t->t = line; t->s = col; ++index; }}

改变坐标时,需注意纹理坐标系的大势。

尽管如此省时实今世码完成了对象,但它有剩余可优化之处。现在逐个介绍小编已实践的优化措施。

2. 相仿通过标志符__global__修饰,调用通过<<<参数1,参数2>>>,用于申明内核函数中的线程数量,以至线程是怎么着组织的。

4.1、使用整数采样器isampler2D轻易并发的精度难题

在省时落成中,使用了浮点类型的采集样板器sampler2D,它采得的是浮点数、范围在[0, 1]内。可是,好多情景下,大家加载和创办UIImage时使用的数据源往往是[0, 255]的卡尺头,最终输出变量必须要乘以255.0作逆映射。为优化这种多余的乘法,现尝试接收整型采集样板器isampler2D。

按从前的编制程序阅世,自然写出如下代码。

// Vertex Shaderuniform isampler2D u_sampler;

只是,获得五个编译错误:declaration must include a precision qualifier for type。

一些着色器需求注解浮点数的精度,那在OpenGL ES 3.0的支出进度中山高校家熟习的步骤,可是,整型采集样本器必要丰盛什么精度修饰符呢?语法相通于单个变量的浮点数精度表明,直接助长精度修饰符在变量种类关键字之后、类型以前,示举个例子下。

// Vertex Shaderuniform lowp isampler2D u_sampler;

现在,通过u_sampler使用texture采集样板,大家赢得了[0, 255]以内的颜色值。

3. 以线程格(Grid)的款式组织,各种线程格由若干个线程块(block)组成,而各样线程块又由若干个线程(thread)组成。

4.2、使用整数采集样板器isampler2D轻易现身的纹路坐标难点

就算,前边的改过让大家赢得了整数颜色值,然则,对于纹理坐标归风流洒脱化,还得每一回都思虑三回,依旧多了一次额外的操作。那么,是或不是可以运用ivec2轮番当前的vec2浮点纹理坐标呢?经尝试,不可行。大概须要额外的设置步骤,基于本身有限的OpenGL ES领悟,权且扬弃此方案。不过,前边的达成可进一层优化为:

vec2 normalized_texcoord = in_texcoord / vec2(u_image_width, u_image_height);

4. 是以block为单位施行的。

4.3、纹理坐标的数据类型

节俭实今世码应用了逐点绘制情势进行每个像素点的操作,那须要转换的纹路坐标与glVertexAttribPointer函数内定数量剖析格式符合,比方:

// Using Vertex Buffer ObjectglVertexAttribPointer(0, 2, GL_UNSIGNED_SHORT, GL_FALSE, 0, NULL);

若生成的纹路坐标为浮点类型,则glVertexAttribPointer的参数需少年老成并为GL_FLOAT,制止不当的多少格式读取,招致坐标值错误,最后输出错误的精打细算结果。

一时,因职业职分比较多,暂未用Accelerate框架完成平等的图像管理并相比两个品质差距。

5. 叧能在主机端代码中调用。

6. 调用时必得注脚内核函数的奉行参数。

7. 在编制程序时,必得先为kernel函数中用到的数组或变量分配好丰盛的半空中,再调用kernel函数,不然在GPU计算时会发生错误,比方越界或报错,以致招致蓝屏和死机。

dim3布局类型

1. dim3是基亍uint3概念的矢量类型,特别亍由3个unsigned int型组成的布局体。uint3档案的次序有四个数据成员unsigned int x; unsigned int y; unsigned int z;

2. 可采纳亍生龙活虎维、二维或三个维度的目录来标记线程,构成意气风发维、二维或三个维度线程块。

3. dim3结构类型变量用在核函数调用的<<<,>>>中。

4. 相关的多少个放置变量

4.1. threadIdx,看名就可见意思获得线程thread的ID索引;假如线程是后生可畏维的那么就取threadIdx.x,二维的还足以多取到三个值threadIdx.y,就那样推算到三维threadIdx.z。

4.2. blockIdx,线程块的ID索引;相近有blockIdx.x,blockIdx.y,blockIdx.z。

4.3. blockDim,线程块的维度,同样有blockDim.x,blockDim.y,blockDim.z。

4.4. gridDim,线程格的维度,相似有gridDim.x,gridDim.y,gridDim.z。

5. 对于大器晚成维的block,线程的threadID=threadIdx.x。

6. 对此大小为(blockDim.x, blockDim.y)的 二维 block,线程的threadID=threadIdx.x+threadIdx.y*blockDim.x。

7. 对此大小为(blockDim.x, blockDim.y, blockDim.z)的 三个维度 block,线程的threadID=threadIdx.x+threadIdx.y*blockDim.x+threadIdx.z*blockDim.x*blockDim.y。

8. 对此总括线程索引偏移增量为已运转线程的总的数量。如stride = blockDim.x * gridDim.x; threadId += stride。

函数修饰符

1. __global__,证明被修饰的函数在装置上实践,但在主机上调用。

上一篇:没有了
下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.tk-web.com. bb电子糖果派对有限公司 版权所有