OpenCL中设置内核参数整理

2024-04-16 07:18

本文主要是介绍OpenCL中设置内核参数整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

资源摘自OpenCL实战.  首先,说一下kernel中的几种地址空间限定符:

(1)__global

该参数的数据会保存在全局数据空间,在内核中的参数使用例子如下:

__kernel void kernel_func(__global float *f)

{


}

(2)__constant

该参数的数据会保存在全局,只读内存中,该参数使用前必须初始化

(3)__local

该参数数据保存在局部内存中,需要注意的是,不论主机还是设备都不能直接初始化内核中的局部变量。

__local float x=4.0;  //编译出错

改成下面方式:

__local float x;

x=4.0;

(4)__private

默认限定符,也就是说所有未标明限定的都是该限定符。私有地址空间仅每个工作项自己可见。

然后,是每一个kernel中数据的设置方式

(1)__global使用clSetKernelArg()设定

clSetKernelArg(kernel,0,sizeof(cl_mem),&cl_mem_instance);

(2)__local以及__private

clSetKernelArg(kernel,0,16*sizeof(float),NULL)

对应内核:

__kernel void proc_data(__local float *nums,...)

{


}

私有内存的设置

int num_iterations=4;

clSetKernelArg(kernel,0,sizeof(num_iterations),&num_iterations);

也就是说最后一个参数设置成基本的int*,float*,char*等类型

对于向量型数据可以采用如下方式:

float nums[4] = {0.0f,1.0f,2.0f,3.0f};

cl_kernelArg(kernel,0,sizeof(nums),nums);

__kernel void proc_data(float4 values,...)

{


}

在OpenCL Parallel Programming Developement Cookbook中还提到了使用用户定义的struct类型的方法

在宿主机端和设备内核中都进行如下定义:

typedef struct UserData{

    int x;

    int y;

    int z;

    int w;

};

宿主机端程序:

#define DATA_SIZE 1048576

userData *ud_in =(UserData *)malloc(sizeof(UserData)*DATA_SIZE);

//initialization omitted

cl_mem UDObj = clCreateBuffer(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PRT,sizeof(UserData)*DATA_SIZE,ud_in,&error);

if(error != CL_SUCCESS)

{

         perror("Unable to create buffer object");

        exit(1);

}

//内核参数设置

error = clSetKernelArg(kernels[i],0,sizeof(cl_mem),&UDObj);

另外需要注意的是,整个OpenCL API是线程安全的,只有一个例外clSetKernelArg()。

线程安全意味着可以有多个宿主机线程同时调用这个函数,而无需提供互斥机制。也就是说,除了clSetKernelArg()之外,应用程序可以从宿主机上的多个线程调用同样的OpenCL函数,OpenCL可以保证其内部状态保持一致。

原因有两点:

1)该函数是最常调用的函数,规范的作者要确保这个函数尽可能是轻量级的。由于线程安全意味着固有开销,所以在保证速度的情况下,没将其定义成线程安全的。

2)除了性能方面的原因,实际应用中很难找到两个线程同时给同一个内核对象设置内核参数的理由。

有了这些基本内核参数设置就应该不成问题了。

这篇关于OpenCL中设置内核参数整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908126

相关文章

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

史上最全nginx详细参数配置

《史上最全nginx详细参数配置》Nginx是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用代理服务器(TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人IgorSyso... 目录基本命令默认配置搭建站点根据文件类型设置过期时间禁止文件缓存防盗链静态文件压缩指定定错误页面跨域问题

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代