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 IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis