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

相关文章

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器