PoCL环境搭建
PoCL环境搭建
- **一.关键功能与优势**
- **二.设计目的**
- **三.测试步骤**
- 1.创建容器
- 2.安装依赖
- 3.编译安装pocl
- 4.运行OpenCL测试程序
Portable Computing Language (PoCL) 简介
Portable Computing Language (PoCL) 是一个开源的、符合标准的异构计算框架,旨在为 OpenCL 应用程序提供高效且可移植的并行计算支持。PoCL 的核心设计目标是实现 跨平台兼容性 和 灵活的后端支持,使开发者能够利用 CPU、GPU 及其他加速器执行 OpenCL 程序,而无需依赖特定厂商的驱动或硬件。
一.关键功能与优势
-
标准兼容性
- 严格遵循 OpenCL 1.2/2.0/3.0 标准,确保与现有代码的兼容性。
- 支持 SPIR-V 中间表示,便于跨设备代码移植。
-
多后端支持
- 提供 LLVM、CUDA、Level Zero、TPU 等多种后端,适配不同硬件架构。
- CPU 后端通过多线程优化实现高性能并行计算,无需专用 GPU。
-
可移植性与灵活性
- 在缺乏原生 OpenCL 驱动的平台上(如某些嵌入式系统或云环境)充当虚拟实现。
- 模块化设计允许用户按需启用后端,降低部署复杂度。
-
调试与优化工具
- 集成 LLVM 工具链,支持内核代码分析与性能调优。
- 提供详细的运行时错误诊断信息,加速开发流程。
二.设计目的
PoCL 的诞生是为了解决 OpenCL 生态的碎片化问题,通过 开源、透明 的实现推动异构计算的普及。它特别适用于以下场景:
- 科研与教育:无需昂贵硬件即可学习 OpenCL 并行编程。
- 跨平台部署:单一代码库适配多种设备(从边缘计算到数据中心)。
- 厂商中立性:减少对特定硬件厂商的依赖,促进代码长期可维护性。
通过平衡性能与可移植性,PoCL 成为开源异构计算领域的重要工具,助力开发者高效利用现代硬件潜力。
三.测试步骤
1.创建容器
docker stop ocl
docker rm ocl
docker run --shm-size=32g -it --privileged --net=host \-v $PWD:/home -w /home \--name ocl ghcr.io/intel/llvm/ubuntu2204_build /bin/bash
2.安装依赖
sudo su
apt update
apt install libclang-dev libclang-cpp-dev zlib1g-dev libtinfo-dev -y
apt install llvm clang pkg-config -y
apt install libhwloc-dev hwloc libhwloc-common -y
3.编译安装pocl
git clone https://github.com/pocl/pocl.git
cd pocl
git checkout remotes/origin/release_6_1
cmake -DCMAKE_BUILD_TYPE=Debug .
make -j
make install
rm /etc/OpenCL/vendors/*
cp /usr/local/etc/OpenCL/vendors/pocl.icd /etc/OpenCL/vendors/
export OCL_ICD_VENDORS=/usr/local/etc/OpenCL/vendors
export LD_LIBRARY_PATH=/usr/local/lib/pocl:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib/pocl:/usr/local/lib/:$LD_LIBRARY_PATH
4.运行OpenCL测试程序
cat > opencl_add.c <<-'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif#define N 1024const char *kernelSource =
"__kernel void vector_add(__global const float *a, \n"
" __global const float *b, \n"
" __global float *c) { \n"
" int i = get_global_id(0); \n"
" c[i] = a[i] + b[i]; \n"
"} \n";// 查找包含指定名称的平台
cl_platform_id find_platform(const char *name) {cl_uint num_platforms;cl_platform_id *platforms;cl_platform_id found_platform = NULL;clGetPlatformIDs(0, NULL, &num_platforms);platforms = malloc(num_platforms * sizeof(cl_platform_id));clGetPlatformIDs(num_platforms, platforms, NULL);for (cl_uint i = 0; i < num_platforms; i++) {char platform_name[128];clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, 128, platform_name, NULL);if (strstr(platform_name, name)) {found_platform = platforms[i];break;}}free(platforms);return found_platform;
}int main() {cl_platform_id platform;cl_device_id device;cl_context context;cl_command_queue queue;cl_program program;cl_kernel kernel;cl_mem bufA, bufB, bufC;cl_int err;// 初始化数据float a[N], b[N], c[N];for (int i = 0; i < N; i++) {a[i] = i;b[i] = i * 2;}// 查找POCL平台platform = find_platform("Portable Computing Language");if (platform == NULL) {printf("POCL platform not found!\n");return 1;}// 获取设备(POCL通常使用CPU设备)clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, &device, NULL);// 创建上下文和命令队列context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);queue = clCreateCommandQueueWithProperties(context, device, 0, &err);// 创建缓冲区bufA = clCreateBuffer(context, CL_MEM_READ_ONLY, N*sizeof(float), NULL, NULL);bufB = clCreateBuffer(context, CL_MEM_READ_ONLY, N*sizeof(float), NULL, NULL);bufC = clCreateBuffer(context, CL_MEM_WRITE_ONLY, N*sizeof(float), NULL, NULL);// 传输数据clEnqueueWriteBuffer(queue, bufA, CL_TRUE, 0, N*sizeof(float), a, 0, NULL, NULL);clEnqueueWriteBuffer(queue, bufB, CL_TRUE, 0, N*sizeof(float), b, 0, NULL, NULL);// 创建程序program = clCreateProgramWithSource(context, 1, &kernelSource, NULL, NULL);clBuildProgram(program, 1, &device, NULL, NULL, NULL);// 创建内核kernel = clCreateKernel(program, "vector_add", NULL);clSetKernelArg(kernel, 0, sizeof(cl_mem), &bufA);clSetKernelArg(kernel, 1, sizeof(cl_mem), &bufB);clSetKernelArg(kernel, 2, sizeof(cl_mem), &bufC);// 执行内核size_t global_size = N;clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global_size, NULL, 0, NULL, NULL);// 读取结果clEnqueueReadBuffer(queue, bufC, CL_TRUE, 0, N*sizeof(float), c, 0, NULL, NULL);// 验证int correct = 1;for (int i = 0; i < N; i++) {if (c[i] != a[i] + b[i]) {correct = 0;break;}}printf("Result: %s\n", correct ? "Correct" : "Wrong");// 清理资源clReleaseMemObject(bufA);clReleaseMemObject(bufB);clReleaseMemObject(bufC);clReleaseKernel(kernel);clReleaseProgram(program);clReleaseCommandQueue(queue);clReleaseContext(context);return 0;
}
EOF
gcc -o opencl_add -g -DCL_TARGET_OPENCL_VERSION=300 opencl_add.c -lOpenCL
./opencl_add
相关文章:
PoCL环境搭建
PoCL环境搭建 **一.关键功能与优势****二.设计目的****三.测试步骤**1.创建容器2.安装依赖3.编译安装pocl4.运行OpenCL测试程序 Portable Computing Language (PoCL) 简介 Portable Computing Language (PoCL) 是一个开源的、符合标准的异构计算框架,旨在为 OpenCL…...
【前端Skill】点击目标元素定位跳转IDE中的源代码
参考:https://juejin.cn/post/7326002010084311079 快手开源项目: https://github.com/zh-lx/code-inspector 目前在umi项目中用到 记录一下umi项目中如何使用 安装 npm i code-inspector-plugin -D --registryhttps://registry.npmmirror.com/ 配…...
OpenCV图像上加数字水印示例
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 14.1 基本概念 当今,生成式人工智能(Artificial Intelligence Generated Content,AIGC)的火爆引燃了数字水印,说实话数字水印并不是一项新的技术&…...
Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术
1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…...
使用blob文件流
1.后端 GetMapping(value "/static/**")public void view(HttpServletRequest request, HttpServletResponse response) {// ISO-8859-1 > UTF-8 进行编码转换String imgPath extractPathFromPattern(request);if(oConvertUtils.isEmpty(imgPath) || imgPath&q…...
Day-1 漏洞攻击实战
实训任务1 漏洞攻击实战一 使用 御剑 得到网站后台地址 数据库登录与日志配置 使用默认密码 root:root 登录phpMyAdmin,执行 SHOW VARIABLES LIKE general% 查看日志状态。 开启日志功能:set global general_log "ON";(配图&…...
AOSP Android14 Launcher3——RecentsView最近任务数据加载
最近任务是Launcher中的一个重要的功能,显示用户最近使用的应用,并可以快速切换到其中的应用;用户可以通过底部上滑停顿进入最近任务,也可以在第三方应用底部上滑进最近任务。 这两种场景之前的博客也介绍过,本文就不…...
基于深度学习的校园食堂菜品智能结算系统
校园食堂菜品智能结算系统说明文档 1. 系统概述 本系统是一款基于YOLO深度学习算法的校园食堂菜品智能结算平台,旨在通过计算机视觉技术实现食堂菜品的自动识别与结算,提高结算效率,减少人工成本,优化用户体验。系统采用PyQt5框…...
【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass
从 HBuilderX 4.56 ,vue2 项目也将默认使用 dart-sass 预编译器。 vue2开发者sass预处理注意: sass的预处理器,早年使用node-sass,也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。node-sass已经停维很久了。 另…...
AI 硬件定制:开启智能新时代的钥匙
AI 硬件定制:开启智能新时代的钥匙 在科技飞速发展的当下,人工智能(AI)已不再是遥不可及的概念,它正以惊人的速度融入我们生活的方方面面。从智能手机中的语音助手,到工厂里的自动化生产线,AI 的身影无处不在。而在这股 AI 浪潮中,AI 硬件定制正逐渐崭露头角,成为推动…...
SpringBoot中配置文件的加载顺序
下面的优先级由高到低 命令行参数java系统属性java系统环境变量外部config文件夹的application-{profile}.ym文件外部的application-{profile}.ym文件内部config文件夹的application-{profile}.ym文件内部的application-{profile}.ym文件外部config文件夹的application.ym文件外…...
hooker frida版just_trust_me.js 2025升级 支持boringssl unpinning
曾几何时,我翻版了 Xposed 的 just_trust_me.apk, just_trust_me.js 脚本仿佛是一张通行证,让我们在 SSL Pinning 的高墙前轻松穿越。 但时代变了。BoringSSL、Cronet、静态 inline hook、动态 verify callback……一切都变得更加隐蔽和棘手…...
React Article模块
实现基础文章发布 安装富文本编辑器 使用useEffect钩子函数获取到channelList,对channelList函数进行一个遍历 渲染到option 实现表单校验 1给Form组件绑定onFinish()函数 拼接表单数据 上传封面 onChange函数获得的参数...
机器学习第二篇 多变量线性回归
数据集:世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom,来预测幸福指数得分。 文件一:linear,…...
C语言对n进制的处理
先看一道题目: 从键盘获取一个正整数,如果把它转为16进制的数字,那么它是一个几位数呢?如果把它转为28进制又是一个几位数呢? 在讲这个题目之前,我们先要了解进制转换 什么是进制转换? 简单来说,进制就是数位的表示方法。 十进制(常用&am…...
【EasyPan】文件上传、文件秒传、文件转码、文件合并、异步转码、视频切割分析
【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版 文件上传方法解析 一、方法总览 Transactional(rollbackFor Exception.class) public UploadResultDto uploadFile(...)核心能力: 秒传验证:通过MD5文件大小实现文…...
Ubuntu数据连接访问崩溃问题
目录 一、分析问题 1、崩溃问题本地调试gdb调试: 二、解决问题 1. 停止 MySQL 服务 2. 卸载 MySQL 相关包 3. 删除 MySQL 数据目录 4. 清理依赖和缓存 5.重新安装mysql数据库 6.创建程序需要的数据库 三、验证 1、动态库更新了 2、头文件更新了 3、重新…...
Oracle DBA 高效运维指南:高频实用 SQL 大全
大家好,这里是 DBA学习之路,专注于提升数据库运维效率。 目录 前言Top SQL表空间使用率RMAN 备份DataGuard等待事件行级锁在线日志切换用户信息ASM 磁盘组DBLink数据文件收缩AWR 写在最后 前言 作为一名 Oracle DBA,在日常数据库运维工作中&…...
【xlog日志文件】怎么删除里面包含某些字符串的行(使用excel)
将log日志,复制到单独一行 B列(可能一行很长,所以将整合后的放在A列) 使用公式可以筛选出 包含某些字符串的行 为true,将这些行直接删除 IF(COUNT(FIND("MediaMuxterThreadRussia",B2,1))>0,"包含",&quo…...
Spark-Streaming简介和核心编程
Spark-Streaming简介 概述:用于流式数据处理,支持Kafka、Flume等多种数据输入源,可使用Spark原语运算,结果能保存到HDFS、数据库等。它以DStream(离散化流)为抽象表示,是RDD在实时场景的封装&am…...
Docker 快速入门教程
1. Docker 基本概念 镜像(Image): 只读模板,包含创建容器的指令 容器(Container): 镜像的运行实例 Dockerfile: 用于构建镜像的文本文件 仓库(Repository): 存放镜像的地方(如Docker Hub) 2. 安装Docker 根据你的操作系统选择安装方式:…...
【锂电池SOH估计】BP神经网络锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)
目录 效果一览程序获取程序内容研究内容基于BP神经网络的锂电池健康状态估计研究摘要关键词1. 引言1.1 研究背景1.2 研究意义1.3 研究目标2. 文献综述2.1 锂电池SOH估计理论基础2.2 传统SOH估计方法2.3 基于BP神经网络的SOH估计研究进展2.4 研究空白与创新点3. BP神经网络原理3…...
Python常用的第三方模块之二【openpyxl库】读写Excel文件
openpyxl库模块是用于处理Microsoft Excel文件的第三方库,可以对Excel文件中的数据进行写入和读取。 weather.pyimport reimport requests#定义函数 def get_html():urlhttps://www.weather.com.cn/weather1d/101210101.shtml #爬虫打开浏览器上的网页resprequests.…...
成熟软件项目解决方案:360°全景影像显控软件系统
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/147425300 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、Open…...
前端开发核心知识详解:Vue2、JavaScript 与 CSS
一、Vue2 核心知识点 1. Vue2 的双向绑定原理 Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。 利用Object.defineProperty方法对数据对象的属性进行劫持,为每个属性定义getter和setter。getter用于收集依赖,当视图中使用到该属性时…...
JDK安装超详细步骤
🔥【JDK安装超详细步骤】 文章目录 🔥【JDK安装超详细步骤】1. 卸载系统自带的旧版JDK2. 安装JDK113. 验证安装是否成功4. 常见问题4.1 执行java -version提示命令未找到? 1. 卸载系统自带的旧版JDK 查询已安装的OpenJDK包。 rpm -qa | gre…...
PHP中的ReflectionClass讲解【详细版】
快餐: ReflectionClass精简版 在PHP中,ReflectionClass是一个功能强大的反射类,它就像是一个类的“X光透视镜”,能让我们在程序运行时深入了解类的内部结构和各种细节。 一、反射类的基本概念和重要性 反射是指在程序运行期间获…...
JAVA:Web安全防御
目录 一、Web安全基础与常见威胁 OWASP Top 10核心漏洞解析 • SQL注入(SQLi)、跨站脚本(XSS)、跨站请求伪造(CSRF) • 不安全的反序列化、敏感数据泄露 Java后端常见攻击场景 • 通过HttpServletRequest…...
39.剖析无处不在的数据结构
数据结构是计算机中组织和存储数据的特定方式,它的目的是方便且高效地对数据进行访问和修改。数据结构表述了数据之间的关系,以及操作数据的一系列方法。数据又是程序的基本单元,因此无论是哪种语言、哪种领域,都离不开数据结构&a…...
在离线 Ubuntu 环境下部署双 Neo4j 实例(Prod Dev)
在许多开发和生产场景中,我们可能需要在同一台服务器上运行多个独立的 Neo4j 数据库实例,例如一个用于生产环境 (Prod),一个用于开发测试环境 (Dev)。本文将详细介绍如何在 离线 的 Ubuntu 服务器上,使用 tar.gz 包部署两个 Neo4j…...
