OpenCL学习笔记(一)开发环境搭建(win10+vs2019)

前言

异构编程开发,在高性能编程中有重要的,笔者本次只简单介绍下,如何搭建简单的开发环境,可以供有需要的小伙伴们开发测试使用

一、获取opencl的sdk库

1.使用cuda库

若本机有Nvidia的显卡,在安装cuda库后,可以直接在安装目录下找到对应库文件

CUDA下载地址:CUDA Toolkit - Free Tools and Training | NVIDIA Developer

本地版的包比较大,网络版的需要安装时联网下载

建议直接安装最新版本,并在安装前删除的版本

注:需要先安装显卡驱动

安装完成后,可以直接在安装目录下找到库文件,以下是64位库、32位库、include文件

2.使用opencl-sdk预编译库

可以到opencl官网上,直接下载已经编译好的预编译库

下载地址:Releases · KhronosGroup/OpenCL-SDK · GitHub

笔者写文档时,最新发布日期是2023.04.17

下载后,直接解压就可以得到库文件和include文件 ,如下图所示

二、编写cmake文件

set(include_paths# "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/include"{opencl_dir}/OpenCL-SDK-v2023.04.17-Win-x64/include)set(link_paths#"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/lib/x64"{opencl_dir}/OpenCL-SDK-v2023.04.17-Win-x64/lib
)set(link_libsOpenCL.lib
)add_executable(opencltestmain.cpp
)target_include_directories(opencltest PRIVATE${include_paths}
)target_link_directories(opencltest PRIVATE${link_paths}
)target_link_libraries(opencltest${link_libs}
)

cmake文件比较简单,就是直接引入对应opencl库

要注意一点,CUDA的默认安装目录有空格,需要把整个目录放入引号中

三、运行示例

const int N = 1024; // 矩阵大小
const size_t size = N * N * sizeof(float);
int main() {// 初始化输入矩阵float* A = new float[N * N];float* B = new float[N * N];for (int i = 0; i < N * N; i++) {A[i] = 1.0f;B[i] = 2.0f;}// 初始化OpenCL环境cl_platform_id platform;clGetPlatformIDs(1, &platform, NULL);cl_device_id device;clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);cl_context context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);cl_command_queue queue = clCreateCommandQueueWithProperties(context, device, 0, NULL);// 创建OpenCL内存缓冲区cl_mem bufferA = clCreateBuffer(context, CL_MEM_READ_ONLY, size, NULL, NULL);cl_mem bufferB = clCreateBuffer(context, CL_MEM_READ_ONLY, size, NULL, NULL);cl_mem bufferC = clCreateBuffer(context, CL_MEM_WRITE_ONLY, size, NULL, NULL);// 将输入数据传输到OpenCL缓冲区clEnqueueWriteBuffer(queue, bufferA, CL_TRUE, 0, size, A, 0, NULL, NULL);clEnqueueWriteBuffer(queue, bufferB, CL_TRUE, 0, size, B, 0, NULL, NULL);// 创建OpenCL程序对象const char* source = "__kernel void add_matrices(__global const float* A, __global const float* B, __global float* C) { int id = get_global_id(0); C[id] = A[id] + B[id]; }";cl_program program = clCreateProgramWithSource(context, 1, &source, NULL, NULL);clBuildProgram(program, 1, &device, NULL, NULL, NULL);cl_kernel kernel = clCreateKernel(program, "add_matrices", NULL);// 设置OpenCL内核参数clSetKernelArg(kernel, 0, sizeof(cl_mem), &bufferA);clSetKernelArg(kernel, 1, sizeof(cl_mem), &bufferB);clSetKernelArg(kernel, 2, sizeof(cl_mem), &bufferC);// 启动内核size_t globalWorkSize[2] = { N, N };clEnqueueNDRangeKernel(queue, kernel, 2, NULL, globalWorkSize, NULL, 0, NULL, NULL);// 读取结果数据clEnqueueReadBuffer(queue, bufferC, CL_TRUE, 0, size, A, 0, NULL, NULL);// 清理OpenCL资源clReleaseMemObject(bufferA);clReleaseMemObject(bufferB);clReleaseMemObject(bufferC);clReleaseProgram(program);clReleaseKernel(kernel);clReleaseCommandQueue(queue);clReleaseContext(context);// 打印结果std::cout << "Result: " << A[0] << std::endl;delete[] A;delete[] B;int a;std::cin >> a;return 0;
}

整个程序比较简单,若是运行正常,可以直接打印出结果

注:运行前,需要安装好对应的显卡驱动

后记

本文件是使用最简单的方法搭建opencl开发环境

笔者没有AMD显卡的设备,所以未测试相关

若本地是使用的intel集成显卡,使用官方的sdk,也可以找到对应的设备

android系统,笔者未来得及测试,若不想自己编译库,需要自己在android设备上查找下opencl库,目录可能是在/system/vendor/lib/libOpenCL.so。若未找到,可能不支持。若有时间,笔者需要另写一篇文档记录下

由于不同厂家是独立实现的,具体运行时,可能有些结果会有出入,需要具体测试;若不是使用官方的sdk,一个厂家的库,可能只能检测到自家设备

使用厂家的库,经常也会缺少部分封闭库,如C++封装库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/257888.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【洛谷】更换头像

错误展示 今天换头像的时候发现一直换不了&#xff0c;即使显示修改成功&#xff0c;然后我等了半个多小时也还没换好 解决办法 上传成功头像后&#xff0c;按ctrl F5 结果 更新成功&#xff01;

题目:分糖果(蓝桥OJ 2928)

题目描述&#xff1a; 解题思路&#xff1a; 本题采用贪心思想 图解 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e6 9; char s[N];//写字符串数组的一种方法,像数组一样***int main() {int n, x;cin >> n >> x;for(int …

node14升级node16之后无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 新版的依赖 "scripts": {"dev": "webpack-dev-se…

Salesforce×阿里云,影响几何?

实际上&#xff0c;从这个视角来看&#xff0c;Salesforce和阿里云的合作也恰在成为着这个市场的一个新催化剂。“期待Salesforce能给中国市场带来一些新的增量&#xff0c;包括对合作伙伴的态度&#xff0c;对产品的态度等等。”一位CRM相关人士告诉我们。 那么&#xff0c;阿…

外贸CRM系统的含义,外贸CRM有什么作用?

外贸CRM管理系统简单方便&#xff0c;配备多种功能&#xff0c;受到从业者的青睐。可以帮助外贸公司管理客户信息&#xff0c;进行准确营销&#xff0c;随后获得更多销售额。这篇文章向您介绍&#xff1a;外贸CRM是什么意思&#xff1f;以及外贸CRM系统的意义 1.外贸CRM是什么意…

销售管道是什么?CRM销售管道有什么作用?

在之前的文章里&#xff0c;我曾经提到过CRM系统中的销售管道。销售管道可以理解为您的销售过程管道&#xff0c;针对不同的产品线&#xff0c;或不同的销售方式&#xff0c;来创建不同的管道流程。今天我们就来说说&#xff0c;CRM销售管道有什么作用&#xff1f; 销售管道重要…

记录 | windows网络诊断报错:无法自动检测此网络的代理设置

windows网络诊断报错&#xff1a;无法自动检测此网络的代理设置 【解决办法1】 打开Microsoft Edge&#xff0c;找到设置&#xff0c;点击高级&#xff0c;打开代理设置&#xff0c;把所有的都关了&#xff0c;就好了。 【解决办法2】 开始 > 运行 > 输入"cmd"…

Ubuntu18安装(重启黑屏问题)

1. F10 进入bios&#xff0c;选择u盘里的ubuntu镜像 2.进入使用ubuntu&#xff0c;下载 3.重启&#xff0c;esc 4.ubuntu 安e进入 5. nomodeset&#xff08;&#xff09; F10 保存启动 6. 7.没有网 手机usb提供网络 下载有限网卡驱动

vue实现可拖拽列表

直接上代码 <!-- vue实现可拖拽列表 --> <template><div><button click"logcolig">打印数据</button><TransitionGroup name"list" tag"div" class"container"><divclass"item"v-f…

机器学习与低代码开发:创新驱动的双剑合璧

引言 随着科技的日新月异&#xff0c;机器学习和低代码开发已经成为引领技术行业变革的两大重要趋势。机器学习通过模拟人类的学习方式&#xff0c;让计算机具备了自我学习和预测的能力&#xff0c;打破了传统计算机程序的局限性。而低代码开发则以简化软件开发过程为目标&…

模块式雨水调蓄池施工简单,无需大型机械,可实现当天开挖当天回填

模块式雨水调蓄池的施工过程非常简单&#xff0c;无需大型机械和繁琐的施工工艺。在施工过程中&#xff0c;只需要进行简单的开挖和回填即可&#xff0c;而且可以在当天完成。这种施工方式不仅节省了施工时间和成本&#xff0c;还可以避免因大型机械和繁琐工艺引起的安全隐患。…

柏林噪声C++

柏林噪声 随机噪声 如上图所示随机噪声没有任何规律可言&#xff0c;我们希望生成有一些意义的局部连续的随机图案 一维柏林噪声 假设希望生成一段局部连续的随机曲线&#xff0c;可以采用插值的方式&#xff1a;在固定点随机分配y值&#xff08;一般是整数点&#xff09;&a…