sycl异构编程

article/2025/10/5 0:56:00

学习了一天的sycl编程,感觉是挺好的一种技术标准,有intell的dpc++,codeplay的computecpp编译器做的不错,可以用amd和intel的gpu,但是都不支持英伟达的gpu,太可惜。

 

SYCL是一种用于编程异构系统的开放式行业标准。SYCL的设计允许编写标准的C++源代码,使其可以在异构设备或主机上运行。

用于SYCL的术语历史上继承自OpenCL,并添加了一些特定于SYCL的内容。然而,SYCL是一种通用的C++编程模型,可以在OpenCL之外的其他异构API之上进行布局。

SYCL(发音为“sickle”)是一种用于异构计算的免版税、跨平台抽象C++编程模型。SYCL基于并行API或OpenCL等标准的基本概念、可移植性和效率,同时增加了单源C++的易用性和灵活性。

使用SYCL的开发人员能够使用他们习惯的许多技术(如继承和模板)编写标准的现代C++代码。同时,开发人员可以通过SYCL库的功能访问底层实现(如OpenCL)的全部功能,必要时还可以通过API与直接使用底层实现编写的代码进行互操作。

为了减少编程工作量并提高开发人员编写代码的灵活性,SYCL以几种方式扩展了OpenCL模型等标准中的概念,超越了C++特性的一般用途:

•在异构设备上执行并行内核既方便又灵活。常见的并行模式使用简单语法进行优先排序,通过一系列C++类型,程序员可以在需要时表达额外的需求,如同步;

•当使用缓冲区和访问器时,SYCL中的数据访问与数据存储分离。通过依赖C++风格的资源获取即初始化(RAII)习惯用法来捕获设备代码块之间的数据依赖关系,运行时库可以跟踪数据移动并提供正确的行为,而无需手动管理内核实例之间的事件依赖关系,也无需程序员显式移动数据。这种方法使数据并行任务图(可能已经是执行模型的一部分)能够由SYCL程序员轻松安全地构建;

•统一共享内存(USM)为显式数据分配和移动提供了一种机制。这种方法允许在异构设备上使用基于指针的算法和数据结构,并允许跨主机和设备增加代码的重用;

•分层并行语法提供了一种以易于理解的现代C++形式表达数据并行性的方法,类似于OpenCL设备或OpenMP目标设备执行模型。它更清晰地分层并行循环和同步点,以避免代码碎片,并更有效地映射到CPU风格的架构。

SYCL保留了受OpenCL标准启发的执行模型、运行时功能集和设备功能。该标准对SYCL能够支持的所有C++功能施加了一些限制。这确保了设备代码在尽可能广泛的设备上的可移植性。因此,虽然代码可以用标准C++语法编写,并与标准C++程序互操作,但整个C++功能集在SYCL设备代码中不可用。特别是,本规范定义的SYCL设备代码不支持虚拟函数调用、一般的函数指针、异常、运行时类型信息或可能依赖于这些特性或特定主机编译器特性的全套C++库。然而,这些基本限制可以通过一些特定的Khronos或供应商扩展来缓解。

下面是三个实例

void test0()
{const int N = 1024;int data[N];  //allocate data to be worked onqueue myQueue;  //create default queue to enqueue work// By wrapping all the sycl work in a {} block, we ensure// all sycl tasks must complete before existing the block,// because the destructor of resultBuf will wait{//wrap our data varibale in a bufferbuffer<int, 1> resultBuf{ data, range<1>{N} };//create a command group to issue commands to the queuemyQueue.submit([&](handler& cgh) {//request access to the buffer without initializationaccessor writeResult{ resultBuf, cgh, write_only, no_init };// enqueue a parallel for task with N work itemscgh.parallel_for(N, [=](auto idx) {// Initialize each buffer element with its own rank  number starting at 0writeResult[idx] = idx;});  // end of the kernel function});  // end of our commands for this queue}  // end of scope, so we wait for work producing resultBuf to complete// Print resultfor (int i = 0; i < N; i++) {std::cout << "data[" << i << "] = " << data[i] << std::endl;}}

void test1()
{const int N = 1024;//Create default queue to enqueue workqueue myQueue;//Allocate shared memory bound to the device and context associated to the queue//Replacing malloc_shared with malloc_host would yield a correct program that//allocated device-visible memory on the host.int *data = malloc_shared<int>(N,myQueue);myQueue.parallel_for(N, [=](id<1>idx) {//Initialize each buffer element with its own rank number starting at 0data[idx] = idx;}); // End of the kernel functionmyQueue.wait();//Print resultfor (int i=0;i<N;i++)std::cout <<"data["<<i<<"] = "<<data[i]<<std::endl;}
void test2()
{//size of the matricesconstexpr size_t N = 2000;constexpr size_t M = 3000;// Create a queue to work onqueue myQueue;// Create some 2D buffers of float for our matricesbuffer<float, 2>a{ range<2>{N, M} };buffer<float, 2>b{ range<2>{N, M} };buffer<float, 2>c{ range<2>{N, M} };// Launch an asynchronous kernel to initialize a myQueue.submit([&](handler& cgh) {// The kernel writes a, so get a write accessor on itaccessor A{ a, cgh,write_only };// Enqueue a parallel kernel iterating on a N * M 2D iteration spacecgh.parallel_for(range<2>{N, M}, [=](id<2>index) {A[index] = index[0] * 2+ index[1];});});// Launch an asynchronous kernel to initialize bmyQueue.submit([&](handler& cgh) {// The kernel writes b, so get a write accessor on itaccessor B{ b, cgh, write_only };// From the access pattern above, the SYCL runtime detects that this // command_group is independent from the first one and can be // scheduled independently // Enqueue a parallel kernel iterating on a N * M 2D iteration spacecgh.parallel_for(range<2>{N, M}, [=](id<2>index) {B[index] = index[0] * 2014 + index[1] * 42;});});// Launch an asynchronous kernel to compute matrix addition c a bmyQueue.submit([&](handler& cgh) {// In the kernel a and b are read, but c is writtenaccessor A{ a, cgh, read_only };accessor B{ b, cgh, read_only };accessor C{ c, cgh, write_only };// From these accessors, the SYCL runtime will ensure that when // this kernel is run, the kernels computing aand b have completed // Enqueue a parallel kernel iterating on a N * M 2D iteration spacecgh.parallel_for(range<2>{N, M}, [=](id<2>index) {C[index] = A[index] + B[index];});});// Ask for an accessor to read c from application scope.The SYCL runtime// waits for c to be ready before returning from the constructorhost_accessor C{ c, read_only };std::cout << std::endl << "Result:" << std::endl;for (size_t i = 0; i < N; i++) {for (size_t j = 0; j < M; j++) {// Compare the result to the analytic valueif (C[i][j] != i * (2 + 2014) + j * (1 + 42)) {std::cout << "Wrong value " << C[i][j] << "on element " << i << " "<< j << std::endl;exit(-1);}}}std::cout <<"Good computation!"<<std::endl;}

SYCL旨在提高数据的局部性和移动效率

➢ SYCL将数据存储与数据访问分开

➢ SYCL具有用于访问不同地址空间中的数据的独立结构

➢ SYCL允许您创建数据依赖关系图

 

 

数据相关性图的好处

•允许您根据关系描述问题

•不需要排队显式复制

•可以使用RAII执行同步

•必要时自动将数据复制回主机

•消除复杂事件处理的需要

•自动构建内核之间的相关性

•允许运行时生成数据移动优化

•在内核之前预先将数据复制到设备

•避免在内核之后将不必要的数据复制回主机


http://chatgpt.dhexx.cn/article/fF4takMl.shtml

相关文章

异构网络小入

A Survey of Heterogeneous Information Network Analysis Heterogeneous Graph Attention Network 异构网络很火吗&#xff1f; 在一个网络中&#xff0c;不用节点的类型不同&#xff0c;这是肯定的。 所以&#xff0c;异构网络在表征比较复杂的情形时&#xff0c;是比较合适…

【文献学习】异质异构集成

在项目学习遇到“三维异质异构集成&#xff0c;3D Heterogeneous Integration”这个概念&#xff0c;理解起来很是困难&#xff0c;所以查阅一些文献帮助理解。 先说结论&#xff1a;异质异构集成&#xff0c;是指应用跨学科思维&#xff08;能集成进去的东西很多&#xff0c;概…

异构计算, GPU和框架选型指南

深度学习训练和推理的过程中&#xff0c;会涉及到大量的向量(vector)&#xff0c;矩阵(matrix)和张量(tensor)操作&#xff0c;通常需要大量的浮点计算&#xff0c;包括高精度&#xff08;在训练的时候&#xff09;和低精度&#xff08;在推理和部署的时候&#xff09;。GPU&am…

异构计算给我们带来了哪些思考?

虽然异构计算的快速发展给企业创新带来了更加强大的算力支撑&#xff0c;但真正推动异构计算的高速发展和应用落地&#xff0c;笔者认为还需要在以下三个方面做好功课。 从2022年火爆全球的元宇宙&#xff0c;到今年的ChatGPT&#xff0c;以人工智能为代表的科学技术正在创造出…

异构网络的理解

异构网络 (Heterogeneous Network&#xff09;是一种类型的网络&#xff0c;其是由不同制造商生产的计算机&#xff0c; 网络设备 和系统组成的&#xff0c;大部分情况下运行在不同的协议上支持不同的功能或应用。 图1 给出了一种异构网络模型。不同类型的网络&#xff0c;通过…

数据异构

转自&#xff1a;https://my.oschina.net/wangxindong/blog/1531596 1、定义 何谓数据异构&#xff0c;上周交易部门商品的同事过来做分享&#xff0c;又看到这个词&#xff0c;他的PPT里面是 数据库异构。其实我们以前做的事情&#xff0c;也是可以成为数据异构。比如我们将…

异构计算综述

异构计算&#xff08;Heterogeneous computing&#xff09; 异构计算&#xff08;Heterogeneous computing&#xff09;技术从80年代中期产生&#xff0c;由于它能经济有效地获取高性能计算能力、可扩展性好、计算资源利用率高、发展潜力巨大&#xff0c;目前已成为并行/分布计…

什么是同构与异构?及在不同背景下的理解

同构与异构的基本理解 异构&#xff1a; 多个不同类型的物体参与完成某一件事情&#xff0c;异构系统的各个组成部分具有自身的自治性&#xff0c;实现数据共享的前提下&#xff0c;仍保留有自己的应用特性&#xff0c;完整特性&#xff0c;安全特性。同构&#xff1a; 多个相…

CentOS7安装iTop

一、整体架构说明 系统&#xff1a;CentOS7 数据库&#xff1a;mysql itop部署在192.168.0.22上&#xff0c;mysql建在192.168.0.11上 二、准备工作 https://sourceforge.net/projects/itop/?sourcetyp_redirect 下载最新版本itop&#xff0c;此处为iTop-2.6.0-4294.zip 三、…

itop4412 编译android,iTOP-4412开发板-Android5.1- 移植教程

本文档介绍itop-4412开发板上移植 Android5.1 的教程&#xff0c;包括&#xff1a;基础知识、搭建编译环境、编译、repo 下载、烧写等内容。 需要了解的基础知识有 git 和 repo 工具&#xff0c;这两个工具是程序员必备要会使用的工具&#xff1b;搭 建编译环境是基于 Ubuntu14…

centos7下安装itop-2.6.1(一)

一、 iTop概述 iTop&#xff0c;是IT运营门户&#xff08;IT Operation Portal&#xff09;的简称&#xff0c;它是一个开源web应用程序&#xff0c;适用于IT服务的日常运维管理。它基于ITIL最佳实践&#xff0c;适应符合ITIL最佳实践的流程&#xff0c;同时它又很灵活&…

itop在Linux部署环境,iTop的安装部署-测试环境的安装配置- iTop软件安装

本帖最后由 adminlily 于 2020-12-24 09:29 编辑 软件下载 iTop软件可以在网上搜索找到,或到www.itilxf.com社区下载,也可以直接在QQ群的共享里下载,群号是233051696。 下载后,直接解压出来,然后把web文件夹内的文件,全部复制到XAMPP软件的htdocs目录下面,D:\xampp\htdo…

关于iTOP安装过程中报错的问题

Before 首先先来一个链接⬇️ iTop-CN 一般情况下根据链接⬆️中的指示走&#xff0c;然后直接跳到Install就可以了。。 非一般呢❓ 来看一下我在安装过程中出现的问题⬇️ 在你没有wget的时候&#xff0c;你可能需要去先安装一下wget⬇️ 我这里是利用 homebrew 安装的wg…

zabbix怎么配置itop

zabbix如何配置itop 环境 zabbix: 5.2.6 目的: 用iTOP 管理Zabbix 告警信息&#xff0c; 告警信息自动转化工单 教程 官方文档 源代码 配置过程 去到源代码里面把模板下拉下来 关于URL&#xff0c;不同用户的itop也是有对应不同的URL&#xff0c;如果你实在不清楚怎么…

ITOP-1 Docker安装部署itop

ITOP-1 Docker安装部署itop 一、Docker安装部署1、下载docker源2、yum安装docker&#xff0c;并运行3、配置docker镜像加速地址 二、ITOP部署1、登录[docker官网](https://hub.docker.com/)查看所需镜像2、拉取itop镜像3、启动itop4、拉取mysql5.7镜像5、登录itop网页配置 一、…

itop 环境

itop 环境 iTop&#xff0c;即IT运营门户&#xff08;IT Operation Portal&#xff09;&#xff0c;是一个开源web应用程序&#xff0c;用于IT环境的日常运营。它基于ITIL最佳实践&#xff0c;而又不拘泥于任何具体流程。它很灵活&#xff0c;可以适应不管是非正 式的、务实的流…

RHEL/CentOS8安装itop3.0详细实践教程

RHEL8/CentOS8部署itop3.0详细实践教程 1 硬件环境2 软件环境3 关闭防火墙及selinux4 更新yum源5 安装Apache6 安装PHP及依赖7 安装Mariadb&#xff0c;创建iTop数据库8 上传iTop安装包并配置权限9 进入web端&#xff0c;安装GLPI系统10 配置文件修改10.1修改时区为上海10.2修改…

itop启动mysql_使用iTOP进行CMDB资产管理

安装部署iTOP 2、将压缩包上传&#xff0c;安装数据库和http,并安装php的相关插件&#xff1a; unzip iTop-2.4.0-3585.zip yum install httpd php php-gd php-xml mariadb-server php-mysql php-soap php-mcrypt php-ldap -y mv web /var/www/html/ cd /var/www/html/ chown -…

iTOP4412开发板烧写命令集汇总

第一种&#xff1a;通过fastboot、OTG方式烧写 前提&#xff1a;进入“iTOP-4412”&#xff0c;即通过命令reboot重启开发板后&#xff0c;快速连续按回车进入。 在超级终端逐个键入如下命令&#xff08;操作在超级终端&#xff09; &#xff08;1&#xff09;全部烧写 fdisk…

itop搭建及使用

安装&#xff1a; 1.https://blog.csdn.net/kk185800961/article/details/84954918?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromMachineL…