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

相关文章

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

idea设置快捷键风格方式

《idea设置快捷键风格方式》在IntelliJIDEA中设置快捷键风格,打开IDEA,进入设置页面,选择Keymap,从Keymaps下拉列表中选择或复制想要的快捷键风格,点击Apply和OK即可使... 目录idea设www.chinasem.cn置快捷键风格按照以下步骤进行总结idea设置快捷键pyth

MyBatis配置文件中最常用的设置

《MyBatis配置文件中最常用的设置》文章主要介绍了MyBatis配置的优化方法,包括引用外部的properties配置文件、配置外置以实现环境解耦、配置文件中最常用的6个核心设置以及三种常用的Ma... 目录MyBATis配置优化mybatis的配置中引用外部的propertis配置文件⚠️ 注意事项X

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

C#借助Spire.XLS for .NET实现Excel工作表自动化样式设置

《C#借助Spire.XLSfor.NET实现Excel工作表自动化样式设置》作为C#开发者,我们经常需要处理Excel文件,本文将深入探讨如何利用C#代码,借助强大的Spire.XLSfor.N... 目录为什么需要自动化工作表样式使用 Spire.XLS for .NET 实现工作表整体样式设置样式配置

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

Java实现为PDF设置背景色和背景图片

《Java实现为PDF设置背景色和背景图片》在日常的文档处理中,PDF格式因其稳定性和跨平台兼容性而广受欢迎,本文将深入探讨如何利用Spire.PDFforJava库,以简洁高效的方式为你的PDF文档... 目录库介绍与安装步骤Java 给 PDF 设置背景颜色Java 给 PDF 设置背景图片总结在日常的

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl