Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

news2024/11/24 5:51:57

前言

本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录,包含对SYCL、DPC++ extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容

oneAPI编程模型综述

oneAPI编程模型提供了一个全面而统一的开发人员工具组合,可以跨硬件目标使用,包括一系列跨越多个工作负载域的性能库,这些库包括针对每个目标体系结构定制编码的函数,因此相同的函数调用可以在支持的体系结构中提供优化性能

多体系结构编程挑战

目前,在以数据为中心的领域,专用工作负载正在增长。每种以数据为中心的硬件通常需要使用不同的语言和库进行编程,因为没有通用的编程语言或 API,这需要维护单独的代码库。开发人员必须学习一整套不同的工具,因为跨平台的工具支持不一致。为每个硬件平台开发软件需要单独的投资,并且几乎无法重用该工作以针对不同的体系结构。

oneAPI的引入

oneAPI作为一种统一编程模型,包括表达并行性的统一和简化的语言和库,它有着很好的开放性,可以与现有的HPC编程模型相互操作

一个简单的例子

%%writefile lab/simple.cpp
//==============================================================
// Copyright © Intel Corporation
//
// SPDX-License-Identifier: MIT
// =============================================================
#include <sycl/sycl.hpp>
using namespace sycl;
static const int N = 16;
int main(){
  //# define queue which has default device associated for offload
  queue q;
  std::cout << "Device: " << q.get_device().get_info<info::device::name>() << "\n";

  //# Unified Shared Memory Allocation enables data access on host and device
  int *data = malloc_shared<int>(N, q);

  //# Initialization
  for(int i=0; i<N; i++) data[i] = i;

  //# Offload parallel computation to device
  q.parallel_for(range<1>(N), [=] (id<1> i){
    data[i] *= 2;
  }).wait();

  //# Print Output
  for(int i=0; i<N; i++) std::cout << data[i] << "\n";

  free(data, q);
  return 0;
}

这是一个简单的SYCL编程例子,第一行%%writefile lab/simple.cpp的作用是,当将这个代码在jupyter lab中的一个cell中点运行时,将会把除了这一行的代码之外的所有代码保存在jupyterlab的/lab(相对路径)的位置的simple.cpp文件当中

也就是说,运行这个之后只会把代码保存在一个文件中:

之后,在下一个cell中运行这段代码,才是对上面的代码的真正运行:

! chmod 755 q; chmod 755 run_simple.sh;if [ -x "$(command -v qsub)" ]; then ./q run_simple.sh; else ./run_simple.sh; fi

运行结果

 

SYCL

sycl代表了一项行业标准化工作,包括对c++数据并行编程的支持,被概括为“面向opencl的c++单源异构编程”。sycl是一个基于opencl的跨平台的抽象层,它使异构处理器的代码能够使用c++以“单一源”风格编写,使编译器能够分析和优化整个程序,而不管代码要在哪个设备上运行

与opencl不同,sycl包含模板和lambda函数,使高级应用程序软件能够清晰地编码,并优化内核代码的加速。

数据并行c++(dpc++)是一个api实现的sycl编译器。利用了现代c++的生产力优势和熟悉的结构,并结合了数据并行性和异构编程的sycl标准

sycl是一种单源语言,其中主机代码和异构加速器内核可以混合在同一源文件中。程序员可以使用熟悉的c++和代用附加功能的库结构,如用于工作定位的队列,用于数据管理的缓冲区,以及用于并行性的parallel_for来指示应该卸载哪部分的计算和数据

oneAPI编程模型

·平台模型

oneAPI的平台模型基于SYCL平台模型,指定一个主机控制一个或多个设备。主机是计算机,通常是基于cpu的系统,执行程序主要部分

每个设备是一个加速器,一个包含计算资源的专用组件,它可以快速执行操作的子集,通常比cpu更快。每个设备包含一个或多个计算单元,每个计算单元包含一个或处理单元,处理单元是单独的计算引擎

·执行模型

执行模型基于SYCL执行模型,它定义并指定代码(称为内核)如何在设备上执行并于控制主机交互,主机执行模型通过命令组在主机和设备之间协调执行和数据管理。命令组是像内核调用和访问器这样的命令的分组,被提交到队列中执行

执行模型指定了如何在访问器上完成计算,从小的一维数据到大的多维数据集的计算分布在nd范围、工作组、子组的层次结构中,都是在工作提交到命令队列时指定的

需要注意的是,实际的内核代码代表一个工作项执行的工作,内核之外的代码控制的是执行多少并行性,工作的数量和分配时由nd范围和工作组的规格来控制

下图描述nd范围、工作组、子组和工作项之间的关系,总工作量是由工作组大小指定,该实例显示了x*y*z的nd范围大小,x’*y’*z’的工作组大小和x’的子组大小。因此有(x*y*z)/(x’*y’*z’)大小的工作组和(x*y*z)/x’大小的子组

·存储模型

基于SYCl*内存模式,它定义了主机和设备如何与内存交互,它协调主机和设备之间的内存分配和管理。内存模型是一种抽象,其目的是概括和适应不同的主机和设备配置。

在这个模型中,内存驻留在主机或设备上,由主机或设备拥有,并通过声明一个内存对象来指定。有两种不同类型的内存对象,缓冲器和镜像。这些内存对象再主机和设备之间的交互通过访问器(accessor)完成,访问器传达了期望的访问设置,例如主机和设备,以及特定的访问模式,例如读和写

考虑这样一种情况,内存通过传统的malloc调用在主机上分配,一旦在主机上分配了内存,就会创建一个缓冲区对象,它使主机分配的内存能够和设备通信,缓冲区类将该类型的项的类型和数量通信给设备进行计算,一旦主机上创建了缓冲区,设备上运行的访问类型就通过访问器accessor对象进行通信。

内核编程模型

支持主机和设备之间的显示并行性,这种并行性之所以显式,是因为程序员决定哪些代码在主机和设备上执行,它不是自动的,内核代码在加速器上执行。

采用oneAPI编程模型的程序支持单一源,这意味着主机代码和设备代码可以在同一个源文件中,但是,在语言一致性和语言特性方面,主机代码和设备代码中接受的源代码存在差异

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

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

相关文章

Go与数据库:NoSQL数据库的应用

大家好&#xff01;我是[lincyang]。 今天我们将一起探索Go语言与NoSQL数据库结合的强大能力&#xff0c;并通过五个实际案例来深入理解它们的应用。 1. Go与MongoDB的结合 1.1 用户管理系统 在用户管理系统中&#xff0c;我们需要存储用户的基本信息和权限设置。MongoDB的…

MQTT协议零基础快速入门

MQTT协议零基础快速入门 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的发布/订阅消息传输协议&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;和机器对机器&#xff08;M2M&#xff09;通信场景。它具有简单、开放、易于实现等优…

产品经理入门学习(五):思维导图 原型设计

参考引用 黑马-产品经理入门基础课程 1. 思维导图的作用和应用场景 什么是思维导图&#xff1f; 思维导图是一种将思维进行可视化的实用工具。具体实现方法是用一个关键词去引发相关想法&#xff0c;再运用图文并茂的技巧把各级主题的关系用相互隶属的层级表现出来&#xff0c;…

多态 虚函数表深度剖析 纯干货讲解(2)

&#x1f4af; 博客内容&#xff1a;多态 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CSD…

crond服务

目录 一、crond服务基础知识 1、crond服务介绍 2、查看crond服务的状态 3、crond服务配置文件详解 4、额外的配置文件目录 二、crond服务基础命令 1、crond服务使用 2、 管理和操作 crond 服务 3、crond服务命令举例 一、crond服务基础知识 1、crond服务介绍 1、crond…

【redis面试题】双写一致性

文章目录 前言一、什么是双写一致性1. 先删除缓存还是先修改数据库1.1 先删除缓存的情况1.2 先修改数据库的情况 2. 双写一致性的解决方案 二、允许延迟一致的解决方法1. 采用 MQ 中间件2. 采用 canal 中间件 三、强一致性的解决方法1. 采用 Redisson 提供的读写锁 前言 跟着B…

7-2 数论中的模幂运算

solution 欧拉函数法可以解决模幂运算 #include<stdio.h> #include<math.h> int main(){int a, m, n, r1;scanf("%d%d%d", &a, &m, &n);while(m){if(m&1) r(r*a)%n;a(a*a)%n;m>>1; }printf("%d", r);return 0; }给定伪…

AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目 一个长为n(n<30)的原始序列x&#xff0c;x[i]可以取值0或1 一个长为m(m<1e9)的点对序列(s,t)&#xff0c; s序列第i项和t的第i项&#xff0c;均可以取值[1,n]&#xff0c; 如果构造好s和t后&#xff0c;对任意都存在01序列x使得&#xff0c; 则称这个序列是合法…

基于8086家具门安全控制系统设计

**单片机设计介绍&#xff0c;基于8086家具门安全控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 8086家具门安全控制系统设计介绍 8086家具门安全控制系统是一种用于保护家具和保证室内安全的系统。该系统基于808…

类的成员函数总结

前言&#xff1a; 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的…

【java学习—十三】处理流之一:缓冲流(1)

文章目录 0. 引言1. 缓冲流2. 缓冲字节流2.1. 缓冲字节输入流2.2. 缓冲字节输出流2.3. 缓冲流实现文件的复制 3. 缓冲字符流 0. 引言 上一章节讲了&#xff1a;文件字符流和字节流&#xff08;基于硬盘&#xff09; 其中&#xff0c;用到的方法有&#xff1a;FlieInuputStream、…

JDBC简单流程

Step1&#xff1a;加载对应数据库&#xff08;比如mysql、oracle、sqlserver&#xff09;的驱动器 1、以mysql驱动器为例&#xff0c;下载好对应的jar包后&#xff0c;在项目对应目录下新建一个lib文件夹&#xff0c;将jar包复制到该文件夹中。 2、然后选中改jar包&#xff0…

链队的练习

链队的练习 相关内容&#xff1a;队列的链式存储结构&#xff08;链队&#xff09; //链队的初始化、入队、出队、取对头 #include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 typedef int Status; //结点结构 typedef struct QNode{ int data; …

单链表的应用(1)

移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路&#xff1a;&#xff08;1&#xff09;创建三个结构体指针&#xff0c;分别代表一条新链表的头newhead&#xff0c;…

2023 electron最新最简版打包、自动升级详解

这里我将讲解一下从0搭建一个electron最简版架子&#xff0c;以及如何实现打包自动化更新 之前我有写过两篇文章关于electron框架概述以及 常用api的使用&#xff0c;感兴趣的同学可以看看 Electron桌面应用开发 Electron桌面应用开发2 搭建electron 官方文档&#xff1a;ht…

基于变色龙算法的无人机航迹规划-附代码

基于变色龙算法的无人机航迹规划 文章目录 基于变色龙算法的无人机航迹规划1.变色龙搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用变色龙算法来优化无人机航迹规划。 1.变色龙…

5 ip的分配

如上一节所述&#xff0c;需要和其他设备通信&#xff0c;那么需要先配置ip. 1、如何配置ip 1.可以使用 ifconfig&#xff0c;也可以使用 ip addr 2.设置好了以后&#xff0c;用这两个命令&#xff0c;将网卡 up 一下&#xff0c;就可以了 //---------------------------- 使…

VBA技术资料MF79:将范围级别由工作簿变更为工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…