clCreateBuffer参数说明

    xiaoxiao2026-03-01  12

    clCreateBuffer第二个参数可以有多种,详情请点击此次,对于前三个比较简单,在此就忽略。

    1、CL_MEM_USE_HOST_PTR

      对于CL_MEM_USE_HOST_PTR,刚开始buffer object的值是来自于host_ptr,但buffer object处理之后,host_ptr中的值如何变化,这点在OpenCL中没有定义。那就看看A卡对次是如何处理,一个小程序:

    [cpp]  view plain  copy   data=new float[N];   output=new float[N];   for(int i=0;i<N;i++){       data[i]=1;   }   b=1;   ...   bufferA=clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_USE_HOST_PTR,sizeof(float)*N,data,&err);   ...   err=clEnqueueReadBuffer(cmdQueue,bufferA,CL_TRUE,0,sizeof(float)*N,output,0,NULL,&timing_event);   ...   for(int i=0;i<N;i++){      cout<<"output:"<<output[i];      cout<<" data:"<<data[i]<<endl;   }  

    对于kernel函数:

    [cpp]  view plain  copy   __kernel void call_test(__global float* A,const float b)   {       int index=get_global_id(0);        A[index]=b+100;   }   程序执行结果如下:

    [cpp]  view plain  copy   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   output:101 data:101   可以出,对于A卡OpenCL实现来说,对于buffer object操作完之后的值,也写回到host_ptr主机内存中。

    2、CL_MEM_COPY_HOST_PTR

    对于CL_MEM_COPY_HOST_PTR来说,buffer object的初始值使用host_ptr,buffer object操作完成后的值也不会写回到host_ptr主机内存中。继续看代码:

    (修改上述代码创建buffer object代码)

    [cpp]  view plain  copy   bufferA=clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR,sizeof(float)*N,data,&err);   其他代码保持不变,程序结果为:

    [cpp]  view plain  copy   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   output:101 data:1   3、CL_MEM_USE_PERSISTENT_MEM_AMD

      对于CL_MEM_USE_PERSISTENT_MEM_AMD,创建的buffer object是在设备内存上的zero copy buffer。对于CL_MEM_USE_PERSISTENT_MEM_AMD的使用,请看下列代码:

       

    [cpp]  view plain  copy   bufferA=clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_USE_PERSISTENT_MEM_AMD,sizeof(float)*N,0,&err);   checkErr(err,"clCreateBuffer",__LINE__);   void *mapPtr=clEnqueueMapBuffer(cmdQueue,bufferA,CL_TRUE,CL_MAP_WRITE,0,sizeof(float)*N,0,NULL,NULL,&err);   memcpy(mapPtr,data,sizeof(float)*N);   err=clEnqueueUnmapMemObject(cmdQueue,bufferA,mapPtr,0,NULL,NULL);   把buffer object映射到主机地址空间。
    转载请注明原文地址: https://ju.6miu.com/read-1307489.html
    最新回复(0)