当前位置: 首页 > news >正文

opencl 封装简单api

这是cl代码

kernel.c

__kernel void add_one(__global float *output,__global  float* pnum) 
{int x=get_global_id(0);output[x]+=pnum[0];
}

c代码

#include <CL/cl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<stdarg.h>typedef struct {cl_platform_id platform_id;cl_device_id device_id;cl_context context;cl_command_queue command_queue;cl_program program;cl_kernel kernel;cl_mem mem_objects[10]; // 假设最多有10个内存对象int mem_count;
} OpenCLContext;// 初始化OpenCL上下文
void cl_init(OpenCLContext *ctx) {cl_int err;ctx->mem_count = 0;// 获取平台IDclGetPlatformIDs(1, &ctx->platform_id, NULL);// 获取设备IDclGetDeviceIDs(ctx->platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &ctx->device_id, NULL);// 创建上下文ctx->context = clCreateContext(NULL, 1, &ctx->device_id, NULL, NULL, &err);if (err != CL_SUCCESS) {fprintf(stderr, "Failed to create OpenCL context\n");exit(EXIT_FAILURE);}// 创建命令队列ctx->command_queue = clCreateCommandQueue(ctx->context, ctx->device_id, 0, &err);if (err != CL_SUCCESS) {fprintf(stderr, "Failed to create OpenCL command queue\n");exit(EXIT_FAILURE);}//ctx->command_queue=1;
}// 加载OpenCL程序
void cl_load(OpenCLContext *ctx, const char *source,char*funcname) {cl_int err;// 创建程序ctx->program = clCreateProgramWithSource(ctx->context, 1, (const char **)&source, NULL, &err);if (err != CL_SUCCESS) {fprintf(stderr, "Failed to create OpenCL program\n");exit(EXIT_FAILURE);}// 构建程序err = clBuildProgram(ctx->program, 1, &ctx->device_id, NULL, NULL, NULL);if (err != CL_SUCCESS) {char build_log[1024];clGetProgramBuildInfo(ctx->program, ctx->device_id, CL_PROGRAM_BUILD_LOG, sizeof(build_log), build_log, NULL);fprintf(stderr, "Failed to build OpenCL program:\n%s\n", build_log);exit(EXIT_FAILURE);}// 创建内核ctx->kernel = clCreateKernel(ctx->program, funcname, &err); // 假设内核名为my_kernelif (err != CL_SUCCESS) {fprintf(stderr, "Failed to create OpenCL kernel\n");exit(EXIT_FAILURE);}
}// 分配OpenCL内存
cl_mem cl_malloc(OpenCLContext *ctx, size_t size) {cl_int err;cl_mem mem = clCreateBuffer(ctx->context, CL_MEM_READ_WRITE, size, NULL, &err);if (err == CL_SUCCESS && ctx->mem_count < 10) {ctx->mem_objects[ctx->mem_count++] = mem;} else {fprintf(stderr, "Failed to allocate OpenCL memory\n");exit(EXIT_FAILURE);}return mem;
}// 向OpenCL内存写入数据
void cl_write(OpenCLContext *ctx, cl_mem mem, const void *data, size_t size) {cl_int err;err = clEnqueueWriteBuffer(ctx->command_queue, mem, CL_TRUE, 0, size, data, 0, NULL, NULL);if (err != CL_SUCCESS) {fprintf(stderr, "Failed to write to OpenCL memory\n");exit(EXIT_FAILURE);}
}// 从OpenCL内存读取数据
void cl_read(OpenCLContext *ctx, cl_mem mem, void *data, size_t size) {cl_int err;err = clEnqueueReadBuffer(ctx->command_queue, mem, CL_TRUE, 0, size, data, 0, NULL, NULL);if (err != CL_SUCCESS) {fprintf(stderr, "Failed to read from OpenCL memory\n");exit(EXIT_FAILURE);}
}// 执行OpenCL内核
void cl_exec(OpenCLContext *ctx, size_t global_work_size, size_t local_work_size, int num_args, ...) {va_list args;cl_int err;va_start(args, num_args);for (int i = 0; i < num_args; i++) {cl_mem mem = va_arg(args, cl_mem);err = clSetKernelArg(ctx->kernel, i, sizeof(cl_mem), (void *)&mem);if (err != CL_SUCCESS) {fprintf(stderr, "Failed to set OpenCL kernel argument\n");exit(EXIT_FAILURE);}}va_end(args);err = clEnqueueNDRangeKernel(ctx->command_queue, ctx->kernel, 1, NULL, &global_work_size, &local_work_size, 0, NULL, NULL);if (err != CL_SUCCESS) {fprintf(stderr, "Failed to execute OpenCL kernel\n");exit(EXIT_FAILURE);}// 等待命令队列完成(可选,取决于是否需要同步)clFinish(ctx->command_queue);
}// 释放OpenCL资源
void cl_free(OpenCLContext *ctx) {for (int i = 0; i < ctx->mem_count; i++) {clReleaseMemObject(ctx->mem_objects[i]);}clReleaseKernel(ctx->kernel);clReleaseProgram(ctx->program);clReleaseCommandQueue(ctx->command_queue);clReleaseContext(ctx->context);
}int main() {OpenCLContext ctx;//cl_int err;// 初始化OpenCL上下文cl_init(&ctx);char code[512];memset(&code,0,sizeof(code));// OpenCL内核源代码(这里应该是一个完整的内核函数定义)const char *kernel_source = &code;FILE*f=fopen("kernel.cl","rb");fread(code,sizeof(code),1,f);fclose(f);// 加载OpenCL程序cl_load(&ctx, kernel_source,"add_one");// 分配OpenCL内存float data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cl_mem buffer = cl_malloc(&ctx, sizeof(data));cl_mem buf2=cl_malloc(&ctx,sizeof(float));float f2=1;// 向OpenCL内存写入数据cl_write(&ctx, buffer, data, sizeof(data));cl_write(&ctx,buf2,&f2,sizeof(float));// 执行OpenCL内核size_t global_work_size = 10;size_t local_work_size = 1;cl_exec(&ctx, global_work_size, local_work_size, 2, buffer,buf2);// 从OpenCL内存读取数据float result[10];cl_read(&ctx, buffer, result, sizeof(result));// 打印结果for (int i = 0; i < 10; i++) {printf("%f\n", result[i]); // 应该打印出2, 4, 6, 8, 10, 12, 14, 16, 18, 20}puts("-----------------");//cl_write(&ctx, buffer, data, sizeof(data));f2=2;cl_write(&ctx,buf2,&f2,sizeof(float));// 执行OpenCL内核cl_exec(&ctx, global_work_size, local_work_size, 2, buffer,buf2);// 从OpenCL内存读取数据cl_read(&ctx, buffer, result, sizeof(result));// 打印结果for (int i = 0; i < 10; i++) {printf("%f\n", result[i]); // 应该打印出2, 4, 6, 8, 10, 12, 14, 16, 18, 20}puts("-----------------");// 释放OpenCL资源cl_free(&ctx);return 0;
}

相关文章:

opencl 封装简单api

这是cl代码 kernel.c __kernel void add_one(__global float *output,__global float* pnum) {int xget_global_id(0);output[x]pnum[0]; } c代码 #include <CL/cl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include<st…...

超快速的路径优化IKD-SWOpt:SHIFT Planner 中增量 KD 树滑动窗口优化算法详解

IKD-SWOpt&#xff1a;SHIFT Planner 中增量 KD 树滑动窗口优化算法详解 今天本博主王婆卖瓜自卖自夸&#x1f604;&#xff0c;介绍自己paper中的算法&#xff0c;本算法已经持续开源中(部分关键内容)Github&#xff0c;之前很多读者朋友一直说要详细讲讲路径优化算法&#x…...

精读DeepSeek v3技术文档的心得感悟

最近宋大宝同学读完了DeepSeekv3的文档&#xff0c;心中颇多感慨&#xff0c;忍不住想在这里记录一下对这款“业界有望启示未来低精度训练走向”的开源大模型的观察与思考。DeepSeek v3的亮点绝不仅仅是“Float8”或“超长上下文”这么简单&#xff0c;而是贯穿了从数值精度、注…...

【Java数据结构】LinkedList与链表

认识LinkedList LinkedList就是一个链表&#xff0c;它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来&#xff0c;所以不需要数组。LinkedList也是以泛型的方法实现的&#xff0c;所以使用这个类都需要实例化对象。 链表分为很多种&#xff0c;比…...

uniapp——微信小程序,从客户端会话选择文件

微信小程序选择文件 文章目录 微信小程序选择文件效果图选择文件返回数据格式 API文档&#xff1a; chooseMessageFile 微信小程序读取文件&#xff0c;请查看 效果图 选择文件 /*** description 从客户端会话选择文件* returns {String} 文件路径*/ const chooseFile () &g…...

【CSS in Depth 2 精译_098】17.3:CSS 动画延迟技术与填充模式设置 + 17.4:通过 CSS 动画传递意图的秘诀

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 17 章 动画】 ✔️ 17.1 关键帧17.2 3D 变换下的动画设置 17.2.1 添加动画前页面布局的构建17.2.2 为布局添加动画 17.3 动画延迟与填充模式 ✔️17.4 通过动画传递意图…...

Oracle考试多少分算通过?

OCP和OCM认证的考试及格分数并不是固定的&#xff0c;而是根据考试的难度和考生的整体表现来确定。对于OCP认证&#xff0c;考生需要全面掌握考试要求的知识和技能&#xff0c;并在考试中表现出色才有可能通过。而对于OCM认证&#xff0c;考生则需要在每个模块中都达到一定的水…...

在云服务器中编译IDF(ESP32库)

登录云服务器 使用gitee从github上导入仓库 地址GitHub - espressif/esp-idf: Espressif IoT Development Framework. Official development framework for Espressif SoCs. 然后在云服务器中创建目录~/esp 进入路径后使用git clone 下载项目 进入编程指南ESP-IDF 编程指南…...

Oracle 日常巡检

1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具&#xff0c;特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top&#xff0c;top 会显示一个实时更新的界面&#xff0c;其中包含系统的关键指标&am…...

机器学习常用术语

目录 概要 机器学习常用术语 1、模型 2、数据集 3、样本与特征 4、向量 5、矩阵 6、假设函数与损失函数 7、拟合、过拟合与欠拟合 8、激活函数(Activation Function) 9、反向传播(Backpropagation) 10、基线(Baseline) 11、批量(Batch) 12、批量大小(Batch Size)…...

springboot507基于Springboot教学管理系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装教学管理系统软件来发挥其高效地信息处理的作用&#xff0c…...

工具变量笔记

补充知识 简单介绍工具变量 假设 Y i α β D i ϵ i Y_i\alpha\beta D_i\epsilon_i Yi​αβDi​ϵi​, where E ( ϵ i ∣ D i ) 0 E(\epsilon_i\mid D_i)0 E(ϵi​∣Di​)0. 但是通常这个条件不满足。于是假如有这样一个工具变量 Z i Z_i Zi​存在的话&#xff0c;满…...

ElasticSearch 统计分析全攻略

在大数据时代&#xff0c;数据的价值不仅在于存储&#xff0c;更在于能够从中挖掘出有意义的信息。ElasticSearch 作为一款强大的分布式搜索引擎&#xff0c;除了具备出色的搜索功能外&#xff0c;其内置的统计分析能力也不容小觑&#xff0c;能够助力我们快速洞察数据背后的规…...

DataCap MongoDB Driver: 全面解析MongoDB在DataCap中的使用指南

在大数据时代&#xff0c;MongoDB作为一款广受欢迎的NoSQL数据库&#xff0c;其灵活的文档存储模型和强大的查询能力使其成为许多现代应用的首选数据存储方案。今天&#xff0c;我们将深入探讨DataCap MongoDB Driver&#xff0c;这是一个强大的工具&#xff0c;它让在DataCap环…...

DDSort-简单实用的jQuery拖拽排序插件

DDSort.js是一款简单实用的jQuery拖拽排序插件。通过该插件你可以任意拖动页面中元素&#xff0c;并放置到指定的地方。DDSort.js插件实用简单&#xff0c;兼容IE8浏览器。 在线预览 下载 使用方法 实用该拖拽排序插件需要在页面中引入jquery文件和ddsort.js文件。 <scri…...

「下载」智慧园区及重点区域安全防范解决方案:框架统一规划,建设集成管理平台

智慧园区在基础设施建设和管理上仍存在诸多挑战。园区内场景碎片化、系统独立化、数据无交互、应用无联动等问题普遍存在&#xff0c;导致管理效率低下&#xff0c;安全隐患频发。 各安保系统如视频监控系统、报警管理系统、门禁管理系统等独立运行&#xff0c;数据不共享&…...

华为 IPD,究竟有什么特点?(一)

关注作者 &#xff08;一&#xff09;华为版 IPD 特点一&#xff1a;一定要让研发转身为作战 部队 冲到前台的研发&#xff0c;应主动拉通公司上下游&#xff0c;向前抓需求&#xff0c;向后支撑可制造性、可 服务性&#xff0c;并推动制造、服务的改进。 1&#xff09;研发从…...

Llama 3 后训练(三)

目录 4. 后训练 4.1 建模 图表解读 4.1.1 聊天对话格式 4.1.2 奖励建模 4.1.3 监督微调&#xff08;Supervised Finetuning&#xff09; 4.1.4 直接偏好优化&#xff08;Direct Preference Optimization&#xff09; 4.1.5 模型平均&#xff08;Model Averaging&#x…...

Docker 安装全攻略:从入门到上手

Docker 安装全攻略&#xff1a;从入门到上手 在当今的软件开发与部署领域&#xff0c;Docker 已经成为了一项不可或缺的关键技术。它能够将应用程序及其依赖项打包成轻量级、可移植的容器&#xff0c;极大地简化了开发、测试和部署的流程。本文将详细讲解在不同操作系统下 Doc…...

螺杆支撑座在运用中会出现哪些问题?

螺杆支撑座是一种用于支撑滚珠螺杆的零件&#xff0c;通常用于机床、数控机床、自动化生产线等高精度机械设备中。在运用中可能会出现多种问题&#xff0c;这些问题源于多个方面&#xff0c;以下是对可能出现的问题简单了解下&#xff1a; 1、安装不当&#xff1a;安装过程中没…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...