clCreateProgramWithBinary 和 clCreateProgramWithSource

来源:互联网 发布:csol大刀控制台优化吧 编辑:程序博客网 时间:2024/05/22 13:49

摘录:

使用clCreateProgramWithSource()创建完的是一个包含源代码的程序对象;要运行设备上的OpenCL程序必须对它进行编译、连接;而对于用clCreateProgramWithBinary创建的程序对象,则只需要进行连接。最后构建成一个完整的可加载的执行程序。我们通过clBuildProgram这个函数来构建OpenCL程序。

(即,到buildProgram这一步,也还是在host端进行,build的结果是构造成一个完整的课加载至设备端的执行程序~哦~)

 

关于:clCreateBuffer的                   flags参数

                                   摘录自:《跨平台的多核与重核编程讲义------OpenCL的方式》

flag指定所要分配的存储器对象的分配和使用信息:

使用信息:CL_MEM_READ_WRITE(默认) 和 CL_MEM_READ_ONLY 和 CL_MEM_WRITE_ONLY

分配信息:【1】     CL_MEM_USE_HOST_PTR 此属性允许用户将host_ptr中指向的内存缓冲起来,已备kernel在OpenCL实现中调用。此时,host必须指向host端有效地址,size为内存长度。OpenCL不允许多个buffer共享一个host_ptr,或者多个buffer对象使用的host内存之间有任何重叠区域。

                    【2】     CL_MEM_ALLOC_HOST_PTR 此属性指定OpenCL在创建OpenCL内存对象时自动分配一块儿size大小的host memory,这块内存的指针在调用本API创建时,不透明,创建完成后可以通过指定的OpenCL的其他API获得。在其单独使用此属性时,host_ptr必须为空,故其与【1】互斥。

                    【3】     CL_MEM_COPY_HOST_PTR 在此属性下,OpenCL在创建OpenCL内存对象时,会自动分配一块儿指定大小的内存,该内存可以在host或local,并且将host_ptr中指定长度的内容复制到分配好的内存中。因此,本属性要求host_ptr非空。CL_MEM_COPY_HOST_PTR 不能与CL_MEM_USE_HOST_PTR同时使用。在CL_MEM_COPY_HOST_PTR和CL_MEM_ALLOC_HOST_PTR同时使用的情况下,自动分配的内存一定被分配在host端。

如果没有指明分配属性,将不做相应的分配和数据传输动作。在内核程序运行时直接将内存对象在设备中实现。

 

哈哈,刚才试了一下,用CL_MEM_USE_HOST_PTR做参数,执行clCreateBuffer,如使用参数host_ptr为outbuffer,create出cl_mem outputBuffer内存对象。

则在create之前,对outbuffer进行赋值以及在kernel执行过后,使用outbuffer访问存储结果的outputBuffer中的值,是完全有效的,不知道性能上是有什么差异,不过,是有效的,那么,CL_MEM_USE_HOST_PTR,果真是USE 了 host的了。

既然outbuffer和outputBuffer之间存在数据关联,即传值了,那,我有个问题use的过程是在kernel执行完成之后,对host内存中的outbuffer传值,还是执行过程中间歇性传值,还是触发式传值,哎,无所谓了先。

 

额,还是没太懂,现在再看http://www.cnblogs.com/mikewolf2002/archive/2011/12/18.html,是关于数据传输的文章,正在看,不知道咋样

....after one hour 看不懂啊,/抓狂,pin是啥个意思嘛?path又是啥嘛/抓狂,啊,晕。

 

 

 

附Apple‘s程序:http://www.cocoachina.com/bbs/simple/?t31352.html

其中,clGetDeviceIDs的平台参数为NULL,解释如下:

cl_int    clGetDeviceIDs (cl_platform_id                        platform,                                               cl_device_type                      device_type,                                              cl_uint                                      num_entries,                                               cl_device_id *                        devices,                                               cl_uint *                                   num_devices                                            )


这里的第一个参数,platform是通过调用clGetPlatformIDs函数获得的平台ID。如果这个参数为空,那么行为是实现定义的。对于Apple的OpenCL驱动而言,这个参数传空,那么将默认使用Apple的OpenCL驱动;否则的话可以使用其它第三方的OpenCL驱动。

 

又验证了一个,clEnqueueMapBuffer返回地址为该buffer在host中所映射的内存地址指针。

注意:clEnqueueUnmapBuffer与clEnqueueMapBuffer必须成对儿出现,即在map操作结束后需要释放host端的mapping资源。(mapping资源是啥?)

0 0
原创粉丝点击