opencl学习(六)——local memory使用

由于统一个workgroup中的所有work-item可以共用本地内存(local),也可以通过它进行同组work-item之间的通信,因此我们整理一下local memory的用法。
本地内存可以在kernel内部定义,也可以通过参数传递。下面就来说明一下这两种方式。

下面是一段来自《opencl异构计算》的代码:

__kernel void localAccess(
	__global float* A,
	__global float* B,
	__local float* C)
{
	__local float aLocalArray[1];
	if(get_local_id(0) == 0)
	{
		aLocalArray[0] = A[0];
	}
	C[get_local_id(0)] = A[get_global_id(0)];
	barrier( CLK_LOCAL_MEM_FENCE );
	float neighborSum = C[get_local_id(0)] + aLocalArray[0];
	if( get_local_id(0)>0 )
		neighborSum = neighborSum  + C[get_local_id(0)-1];
	B[get_local_id(0)] = neighborSum;
}

1.第一种创建方式:以内核函数内部变量的形式创建,如上代码中aLocalArray。

规律一:如果一个工作组中的一个工作项或多个工作项读取全局内存中的同一个位置,那么局部内存能大大提高性能。

本例中,aLocalArray是每一个工作项都需要的数据,这样使用使用本地内存,对与每一个workgroup只使用了一个32位本地内存,本组内所有工作项都可访问它。


2.第二种创建方式:以内核参数的形式传递,如上代码中的C。

这种情况下的使用跟内核函数的其他参数使用方式类似,要通过clSetKernelArg函数进行参数配置,但最后一个参数,地址空间设为NULL。

clErrNum = clSetKernelArg(kernel object, parameter index, size in bytes, NULL);




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值