barrier(CLK_LOCAL_MEM_FENCE); barrier(CLK_GLOBAL_MEM_FENCE); http://cjld.github.io/2013/07/31/openclasync/
https://developer.arm.com/documentation/101574/0100/
https://developer.nvidia.com/opencl
https://rocmdocs.amd.com/en/latest/Programming_Guides/Opencl-programming-guide.html
https://rocmdocs.amd.com/en/latest/Programming_Guides/Opencl-programming-guide.html https://www.nersc.gov/assets/pubs_presos/MattsonTutorialSC14.pdf
https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf https://www.khronos.org/files/opencl-1-2-quick-reference-card.pdf
Use the Memory Hierarchy effectively • Organize your computation so it puts the most frequently used data in faster memory … optimized of course around the available size.
OpenCL 是一个小而美的东西,比 OpenGL 要简单很多,妙不可言。( ̄▽ ̄)" OpenGL 需要图形学的知识储备,OpenCL 不太需要。
OpenCL 2.0 异构计算 [第三版 ] (Heterogeneous Computing with OpenCL 2.0)
OpenCL 是一个异构编程架构,其管理者是非盈利技术组织 Khronos Group 。OpenCL 是一个应用开发框架,在其框架下开发的应用,能够在不同的硬件供应商的设备上运行。
OpenCL 2.0 较大的改变有如下内容:
OpenCL 1.2 是支持的最广泛的版本,我采用了这个版本。
讨论 OpenCL 主机端的内存模型,包括资源和内存管理。
图像对象就有些不同,其数据的布局或存放方式在硬件上进行过一些优化,这样指针就很难直接一个一个的访问对应的数据,并且硬件上的数据布局方式对于开发者来说是不可见的。这样,内核端只能使用内置函数对图像对象进行访问。因为 GPU 设计之初就是为了处理图形任务,所以 GPU 对图像数据访问效率已有较高优化。图像有三个优势:
图像对象和数组对象最大的区别,就是图像对象支持的格式。图像格式包括通道序和通道类型。 通道顺序定义了有多少通道需要使用 —— 例如,CL_RGB,CL_R 或 CL_ARGB。通道类型就是要选择通道内数据存储的格式,从 CL_FLOAT 到充分利用内存的 CL_UNORM_SHORT_565(其将一个 16 比特字打包后放入内存)。当内核代码要访问这些数据时,读取到的数据结果都上转换成标准的 OpenCL C 类型数据。图像格式支持的列表可以通过 clGetSupportedImageFormats() 获取。
讨论 OpenCL 在三种完全不同的异构平台上的表现,这三个异构平台包括:
OpenCL C 内核语言也实现了 C 语言中著名的 printf() 函数。printf() 函数也可以用来进行调试,这种调试方式对于 C/C++ 开发者来说并不陌生。
https://blog.csdn.net/breakawayroad/article/details/9003632
GPU 内存可以虚拟化,驱动程序将在 / 不需要时从 GPU 交换内存。
CL_DEVICE_GLOBAL_MEM_SIZE CL_DEVICE_MAX_MEM_ALLOC_SIZE
https://www.cnblogs.com/willhua/p/10123398.html
同时,clEnqueueUnmapMemObject 和 memcpy 都很快,耗时分别为 0.015ms 和 0.0004ms 左右。 从测量结果来看,使用 ION 的方式,在各项速度上都是占优的。使用 OpenCL API 也比较接近。而使用 CL_MEM_USE_HOST_PTR 则会获得比较差的效果。
https://aijishu.com/a/1060000000293412
这里的文档都不错: https://deepinout.com/opencl/opencl-memory-object/opencl-image-descriptor.html
cl_image_format The image format descriptor structure is defined as…
https://www.programminghunter.com/article/1125142473/
虽然对于图像也可以把它的像素数据当做一般的缓存数据来处理,但是如果把它当做图像来处理有如下好处:
https://www.cnblogs.com/laozhanghahaha/p/12580822.html
interpolation 选项 | 所用的插值方法 |
---|---|
INTER_NEAREST | 最近邻插值 |
INTER_LINEAR | 双线性插值(默认设置) |
INTER_AREA | 使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于 INTER_NEAREST 方法。 |
INTER_CUBIC | 4x4 像素邻域的双三次插值 |
INTER_LANCZOS4 | 8x8 像素邻域的 Lanczos 插值 |
https://blog.csdn.net/10km/article/details/50755584
用 OpenCL 实现图像缩放代码是比较简单的,因为 OpenCL 本身就支持双线性插值 下面是 kernel 代码 从 Mali OpenCL SDK 抄来的:/samples/image_scaling/assets/image_scaling.cl
if (!checkSuccess(clGetSupportedImageFormats(context, 0, CL_MEM_OBJECT_IMAGE2D, 0, NULL, &numberOfImageFormats)))