clCreateBuffer参数说明


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

1、CL_MEM_USE_HOST_PTR

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

    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函数:

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

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代码)

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

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的使用,请看下列代码:

   

    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映射到主机地址空间。



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值