OpenCL编程指南-10.1C++包装器API

news2024/10/3 6:30:14

C++包装器API概述

C++API划分为多个类,分别映射到一个OpenCL C类型,例如,cl::Memory类就映射到OpenCL C中的cl_mem。不过,C++ API会尽可能使用继承提供额外的一层类型抽象;例如,类cl::Buffer派生自基类cl::Memory,表示所有可能的OpenCL内存对象的1维内存子类。类层次体系结构见图12-1。
在这里插入图片描述
一般地,C++类类型到底层OpenCL C类型有直接的映射,在这种情况下,底层C类型可以通过操作符()访问。例如,以下代码可以得到第一个OpenCL平台,查询底层OpenCL C类型cl_platform,并把它赋给变量platform:

extern void someFunction(cl_program);

cl_platform platform;
{
    std::vector<cl::Platform> platformList;
    cl::Platform::get(&platformList);
    platform = platformList[0]();
    someFunction(platform); //safe call
}
someFunction(platform); //not safe

这个例子中的最后一行是不安全的,因为矢量platform-List在退出基本代码块时已经撤销,因此,会对platformList中的各个平台做一个隐式的clReleasePlatform调用,从而允许底层OpenCL实现释放所有相关联的内存。

C++包装器API异常

最后,在深入介绍一个详细的例子之前,我们介绍OpenCL C++异常。为了跟踪应用程序中由于OpenCL操作错误而产生的错误,C API使用了cl_int类型错误值。这些错误值会作为一个API函数的结果返回,或者,如果这个API函数返回一个OpenCL对象,错误码会作为函数的最后一个参数返回。C++API支持以这种形式跟踪错误,不过也可以使用C++异常。默认情况下并没有启用异常,会根据底层CAPI设置并返回OpenCL错误码。

要使用异常,必须显式地启用异常,在包含cl.hpp之前定义以下预处理器宏:

__CL_ENABLE_EXCEPTIONS

一旦启用,由OpenCLC调用报告的非CL_SUCCESS错误值将抛出异常类cl::Error。默认情况下,方法cl::Error::what()会返回指向一个串的const指针,指示报告错误的特定C API调用,例如clGetDeviceInfo。可以覆盖cl::Error::what()的默认行为,为此在包含cl.hpp之前要定义以下预处理器宏:

__CL_USER_OVERRIDE_ERROR_STRINGS
//表12-1 预处理器错误宏及其默认值
预处理器宏名                                       默认值
__GET_DEVICE_INFO_ERR                             clCetDeviceInfo
__GET_PLATPORM_INEO_ERR                           clGetPlatformInfo
__GET_DEVICE_IDS_ERR                              clGetDeviceIds
__GET_CONTEXT_INFO_ERR                            clGetContextInfo
__GET_EVENT_INFO_ERR                              clGetEventInfo
__GET_EVENT_PROFILE_INFO_ERR                      clGetEventProfileInfo
__GET_MEM_OBJECT_INPO_ERR                         clGetMemmObjectInfo
__GET_IMAGE_INFO_ERR                              clCetImageInfo
__GET_SAMPLER_INFO_ERR                            clGetSampleInfo
__GET_KERNEL_INFO_ERR                             clGetKernelInfo
__GET_KERNEL_WORK_GROUP_INPO_ERR                  clGetKernelWorkGroupInfo
__GET_PROGRAM_INPO_ERR                            clGetProgramInfo
__GET_PROGRAM_BUILD_INFO_ERR                      clGetProgramBuildInfo
__GET_CONAND_QUEUE_INFO_ERR                       clGetCommandQueueInfo
__CREATE_CONTEXT_FROM_TYPE_ERR                    clCreateContextFromType
__GET_SUPPORTED_IMAGE_FORMATS_ERR                 clGetSupportedImageFormats
__CREATE_BUFEER_ERR                               clCreateBuffer
__CREATE_SUBBUFFER_ERR                            clCreateSubBuffer
__CREATE_GL_BUFFER_ERR                            clCreateGLBuffer
__CREATE_IMAGE2D_ERR                              clCreateImage2D
__CREATE_IMAGE3D_ERR                              clCreateImage3D
__SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR          clSetMemmObjectDestructorCallback
__CREATE_USER_EVENT_ERR                           clCreateUserEvent
__SET_USER_EVENT_STATUS_ERR                       clSetUserEventStatus
__SET_EVENT_CALLBACK_ERR                          clSetEventCallback
__WAIT_FOR_EVENTS_ERR                             clWaitForEvents
__CREATE_KERNEL_ERR                               clCreateKernel
__SET_KERNEL_ARGS_ERR                             clSetKernelArgs
__CREATE_PROGRAM_WITH_SOURCE_ERR                  clCreateProgramWithSource
__CREATE_PROGRAM_WITH_BINARY_ERR                  clCreateProgramWithBinary
__BUILD_PROGRAM_ERR                               clBuildProgram
__CREATE_KERNELS_IN_PROGRAM_ERR                   clCreateKernelsInProgram
__CREATE_COMMAND_OUEUE_ERR                        clCreateCommandQueue
__SET_CONMAND_QUEUE_PROPERTY_ERR                  clSetCommandQueueProperty
__ENQUEUE_READ_BUFEER_ERR                         clEnqueueReadBuffer
__ENQUEUE_READ_BUFEER_RECT_ERR                    clEnqueueReadBufferRect
__ENQUEUE_WRITE_BUFFER_ERR                        clEnqueueWriteBuffer
__ENQUEUE_WRITE_BUEFER_RECT_ERR                   clEnqueueWriteBufferRect
__ENQEUE_COPY_BUFEER_ERR                          clEnqueueCopyBuffer
__ENQEUE_COPY_BUFFER_RECT_ERR                     clEnqueueCopyBufferRect
__ENQUEUE_READ_IMAGE_ERR                          clEnqueueReadImage
__ENQUEUE_WRITE_IMAGE_ERR                         clEnqueueWriteImage
__ENQUEUE_COPY_IMAG_ERR                           clEnqueueCopyImage
__ENQUEUE_COPY_IMAGE_TO_BJFEER_ERR                clEnqueueCopyImageToBuffer
__ENQUEUE_COPY_BUFEER_TO_IMAGE_ERR                clEnqueueCopyBufferToImage
__ENQUEUE_MAP_BUFFER_ERR                          clEnqueueMapBuffer
__ENQUEUE_MAP_IMAGE_ERR                           clEnqueueMapImage
__ENQUEUE_UNNAP_MEM_OBJECT_ERR                    clEnqueueUnmapMemObject
__ENQUEUE_NDRANGE_KERNEL_ERR                      clEnqueueNDRangeKernel
__ENQUEUE_TASK_ERR                                clEnqueueTask
__ENQUEUE_NATIVE_KERNEL                           clEnqueueNativeKernel
__ENQUEUE_MARKER_ERR                              clEnqueueMarker
__ENQUEUE_WAIT_FOR_EVENTS_ERR                     clEnqueueWaitForEvents
__ENRQUEUE_BARRIER_ERR                            clEnqueueBarriers
__UNLOAD_COMPILER_ERR                             clUnloadCompiler
__FLUSH_ERR                                       clFlush
__FINISH_ERR                                      clFinish

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频转化率是什么意思,怎么计算,多少算正常?

短视频转化率是指在短视频平台上&#xff0c;观看短视频的用户中&#xff0c;实际进行某种转化行为的比例。转化行为可以是各种具体行动&#xff0c;例如点击链接、访问网站、购买产品等。 一、短视频转化率怎么算&#xff0c;计算公式是什么&#xff1f; 短视频转化率的计算…

Shell命令操作Linux文件系统

Shell命令操作Linux文件系统 文件夹介绍 文件夹常规命令 文件夹权限控制⭐ 文件类型和权限 修改文件权限 移动、复制、删除文件夹 文件夹介绍 Linux文件系统是计算机操作系统中的一个关键组成部分&#xff0c;它用于管理和组织计算机上的数据和信息。先到根目录&#xf…

开学什么牌子的电容笔比较好?便宜好用的触控笔

苹果原装的电容笔和国内的平替电容笔最大的不同之处&#xff0c;就是平替电容笔只有一个倾斜压感功能&#xff0c;而不是像苹果原装的电容笔一样&#xff0c;同时具有着倾斜压感功能与重力压感功能。不过&#xff0c;如果你很少用电容笔作画&#xff0c;那么你也不用选择昂贵的…

【2023集创赛】国家集创中心杯全国二等奖:运算放大器

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;国家集创中心杯二等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电…

OpenCV(二十六):边缘检测(二)

目录 1.Laplacian算子边缘检测 原理&#xff1a; Laplacian边缘检测函数Laplacian() 示例代码&#xff1a; 2.Canny算子边缘检测 原理&#xff1a; Canny算法函数Canny() 示例代码&#xff1a; 1.Laplacian算子边缘检测 原理&#xff1a; Laplacian算子的原理基于图像…

IAST百科全书第16期:IAST与RASP的区别

Hello 大家好&#xff0c;欢迎来到新一期IAST百科全书&#xff0c;之前有同学提问IAST和RASP是不是非常类似&#xff0c;今天就专门给大家展开讲讲。 如果说SAST是从“内部”测试应用程序&#xff0c;DAST是从“外部”测试&#xff0c;那IAST就是“从内到外”进行测试&#xf…

伪静态web.config常见规则写法与参数介绍说明

伪静态web.config常见规则写法与参数介绍说明. 示例1&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"规则 1" stopProcessing"tru…

python Playwright优化页面等待和处理异步操作

在使用 Playwright 进行页面自动化时&#xff0c;优化页面等待和处理异步操作是非常重要的&#xff0c;可以提高脚本的稳定性和执行效率。 优化页面等待和处理异步操作的建议 **1. 使用正确的等待条件&#xff1a;**Playwright 提供了多种等待条件&#xff0c;如等待元素出现…

对时序数据进行分类与聚类

我在最近的工作中遇到了一个问题&#xff0c;问题是我需要根据银行账户在一定时间内的使用信息对该账户在未来的一段时间是否会被销户进行预测。这是一个双元值的分类问题&#xff0c;只有两种可能&#xff0c;即会被销户和不会被销户。针对这个问题一般来说有两种解决策略。 …

Python学习 -- logging模块

logging 模块是 Python 中用于记录日志的标准库&#xff0c;它提供了丰富的功能&#xff0c;可以帮助开发者进行日志记录和管理。以下是关于logging模块的详细使用方式&#xff0c;包括日志级别、处理流程、Logger 类、Handler 类、Filter 类、Formatter 类以及模块中常用函数等…

H5移动端便捷兼容测试方式

一、准备&#xff1a; 1、谷歌浏览器 2、H链接 3、主流设备分辨率、尺寸 二、步骤&#xff1a; 1、打开F12&#xff0c;选择手机模式 2、看顶部设备信息&#xff0c;点击&#xff0c;县级弹窗最底部的edit进入编辑模式 3、添加想要测试的设备&#xff0c;设备的宽高需要按照…

Linux下的系统编程——认识进程(七)

前言&#xff1a; 程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程有个…

数学建模篇---2022国赛C题(二)(全程python,完整论文和代码可取!)

接着上回我们继续第三题 问题 3 对附件表单 3 中未知类别玻璃文物的化学成分进行分析&#xff0c;鉴别其所属类型&#xff0c;并对 分类结果的敏感性进行分析。 我们的分析&#xff1a; 基于问题二的分类模型&#xff0c;计算出每个待测样本点与簇中心的平方欧式距离&#xff0…

Windows 10以后的版本默认不会启用SMBv1

文章目录 SMBv1的历史故事SMBv1 仍然可以在未预装的版本重新安装检查计算机是否启用SMBv11&#xff0c;Server端检测SMBv1是否启用2&#xff0c;客户端检测SMBv1是否启用 Windows 如何禁用SMBv11&#xff0c;Server端用powershell禁用&#xff1a;2&#xff0c;客户端禁用方法&…

链条输送机如何润滑

润滑是使用机械设备过程中不可或缺的保养工作&#xff0c;链条输送机也不例外&#xff0c;但对于第一次使用链条机的用户来讲&#xff0c;对于哪个部位需要润和以及如何润滑都是一头雾水&#xff0c;今天艾讯就从专业的角度来和您分享一下链条输送机如何润滑的问题。 1、应切断…

vue3 自动导入图片配置

1 npm i vite-plugin-vue-images -D 2 vite.configts.ts 文件中配置 import { defineConfig } from vite import ViteImages from vite-plugin-vue-images export default defineConfig({ //插件中导入指定图片存放的目录 plugins: [ ViteImages({ dirs: [src/assets] }) ] …

霍尔效应的本质

霍尔效应是电磁效应的一种&#xff0c;这一现象是美国物理学家霍尔&#xff08;E.H.Hall&#xff0c;1855—1938&#xff09;于1879年在研究金属的导电机制时发现的。 当电流垂直于外磁场通过半导体时&#xff0c;载流子发生偏转&#xff0c;垂直于电流和磁场的方向会产生一附加…

网络编程套接字 | UDP套接字

前面的文章中我们叙述了网络编程套接字的一些预备知识点&#xff0c;从本文开始我们就将开始UDP套接字的编写。本文中的服务端与客户端都是在阿里云的云服务器进行编写与测试的。 udp_v1 在v1的版本中我们先来使用一下前面讲过得一些接口&#xff0c;简单的构建一个udp服务器…

Oracle数据库环境变量配置以及可能遇到的问题解决

一、如何配置Oracle数据库环境变量&#xff08;以win10为例&#xff09; 1、找到此电脑&#xff0c;鼠标右键&#xff0c;点击属性。 2、点击属性成功后&#xff0c;进入如下页面&#xff0c;找到“高级系统设置”&#xff0c;点击进入。 3、找到环境变量&#xff0c;点击进入…

深眸科技自研轻辙视觉引擎,以AI机器视觉赋能杆号牌识别与分拣

电线杆号牌作为电力行业标识的一种&#xff0c;相当于电线杆的“身份证”&#xff0c;担负着宣传电力知识、安全警示的作用&#xff0c;用于户外使用标记输电线路电压等级、线路名称、杆塔编号等&#xff0c;能够清晰地记录电力线路杆的信息&#xff0c;并为电力线路的更改以及…