AMD OpenCL例子阅读笔记系列之AtomicCounters

这篇博客记录了作者学习OpenCL过程中对AtomicCounters的理解。文章略过环境配置,重点探讨了OpenCL的扩展项,特别是`#pragma OPENCL EXTENSION`的使用,并对比了全局与非全局变量下`atomic_inc`函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         学了OpenCL有一段时间了,对于其思想已经有了一些了解。但是对于一些问题仍然难以理解。学习就是要通过阅读代码和自己试验总结经验。所以就有了这个系列的想法。

         今天看的时AtomaticCounters例子。这里对环境的配置等就略过了,因为这些可以在网上直接找到。

       

#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable        

__kernel 
void atomicCounters(
		volatile __global uint *input,
		uint value,
		counter32_t counter)                          
{
	
	size_t globalId = get_global_id(0);
	
	if(value == input[globalId])
		atomic_inc(counter);
		
}                                                                         



/**
 * Counts number of occurrences of value in input array using 
 * global atomics
 */

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
__kernel 
void globalAtomics(
		volatile __global uint *input,
		uint value,
		__global uint* counter)                         
{                                                                         
	size_t globalId = get_global_id(0);
	
	if(value == input[globalId])
		atomic_inc(&counter[0]);
}                                                                         
     在内核函数中因为要使用到OpenCL中的内置函数,所以在内核中加入了扩展编译选项#pragma OPENCL EXTENSION cl_ext_atomic_counters_32 : enable   以及#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable。先来看下OpenCL扩展,它的格式是:

     #pragma  OPENCL EXTENSION  扩展项:enable/disable

    还有一些比如是否允许化简表达式,格式为:

    #pragma OPENCL  FP_CONTRACT :ON/OFF/DEFAULT

    对于OpenCL的扩展项,其定义的格式为cl_khr_<name>或者cl_<vendor_name>_<name>的开发商形式扩展名。

     再看这两个内核实际上区别非常小,主要就是atomic_inc函数的作用在哪里,一个是全局变量,一个是非全局变量,这里看一下在传入内核参数时候的构建方式:

1)atomicCounter:

int
AtomicCounters::runAtomicCounterKernel()
{
    cl_int status = CL_SUCCESS;
    // Set Global and Local work items
    size_t globalWorkItems = length;
    size_t localWorkItems = counterWorkGroupSize;
    // Initialize the counter value
    cl_event writeEvt;
    status = clEnqueueWri
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值