操作系统实验,oneapi

(实时更新)

目录

实验四补充

实验五补充


实验四补充

一,环境搭建

注册intel devcloud账户

填写信息,提交后等待创建账户

等待邮件验证,接到以下邮件后重新访问Get Started | Intel® DevCloud

登录后点击get_start,在页面左下角点击Launch JupyterLab*

等待登录后效果如下

二,第一个for循环

在云中创建文件夹os_exp

编写helloworld示例代码

编译出错

使用另一编译方法依然报错

修改代码并换icpx命令后可以执行

结果:

结果分析:

该程序使用 SYCL 实现了一个解密算法,先将 secret 字符串拷贝到共享内存中的 result 数组中,然后针对 result 数组用parallel_for并行地将数组中的每个元素都减去 1,相当于将原文中的每个字母向前移动了一位。最后,将解密后的消息打印到控制台。

三,设备选择

方式1:默认的设备选择

编写代码:

编译执行:

结果分析:创建一个 queue 对象 Q,用于执行 SYCL 内核函数。然后,调用 get_device 方法获取与 Q 关联的设备对象,并调用 get_info 方法获取设备名称等详细信息。最后,将设备名称打印到控制台中。

方式2:使用host_selector

代码编写:

编译执行:

结果分析:

创建一个 queue 对象 Q,并将其关联到一个类型为 host_selector 的设备选择器上,选择当前可用的主机设备来处理任务。然后,通过 get_device 方法获取与 Q 关联的设备对象,并分别调用 get_info 方法来获取设备名称和制造商信息。最后,将这些信息打印到控制台中

方式3:使用cpu_selector

代码编写:

编译执行:

结果分析:

创建一个 queue 对象 Q,并将其关联到一个类型为 cpu_selector 的设备选择器上。选择当前可用的 CPU 设备来处理任务。然后,通过 get_device 方法获取与 Q 关联的设备对象,并分别调用 get_info 方法来获取设备名称和制造商信息。最后,将这些信息打印到控制台中。

方式4:使用多个selector

代码编写:

编译出错:

复制到ipynd文件执行:

依然报错 (将sycl改为CL、将INTEL改为小写依然找不到库)

结果分析:

缺少fpga库,程序逻辑为:使用 sycl::gpu_selectorsycl::INTEL::fpga_selector 分别创建了与 GPU 和 FPGA 相关的 SYCL 调度队列对象,分别通过 get_device().get_info() 函数获取所选设备的信息,并输出到终端窗口中。

方式5:既包含host code,又包含device code

代码编写:

编译执行:

结果分析:

定义一个大小为 16 的 std::array<int,size> 对象 data,然后通过 buffer 类创建一个 B 对象,该对象与 data 相关联。接着,创建一个 queue 对象 Q,默认选择当前可用的某个设备进行任务处理。在 Q 上提交一个任务,该任务在设备上并行执行,并使用 handler 对象 h 来分配、同步和管理任务并行执行过程中的内存访问。 在该任务中,使用 accessor 对象 accB 绑定到 h 中用于内核函数的访问器中。h.parallel_for 方法表示对于 size 个条目,以并行方式执行一个内核函数,其中 idx 是一个迭代变量,从 0 到 15 迭代,对于每个 idx,内核函数将 idx 分配给 acc。最后退出

实验五补充

git获取代码

要求1,执行不同版本GEMM代码

将basic版本复制到.ipynd文件中编译执行

结果如下:

 将title版本复制到.ipynd文件中编译执行

结果如下: 

 

 实验练习

修改basic输入为M=N=K=2000如下:

运行结果:

 实验练习,修改title版本titlex、titley并分析结果:

x=2,y=2, workgroup size=4时:

gpu时间为8秒,cpu时间48秒

x=4,y=4, workgroup size=4时:

gpu执行时间减半为4秒,cpu时间50秒

x=8,y=8, workgroup size=4时:

运行超过60s仍未运行完,cpu时间进一步增加

 分析结果:

因为每次处理 workgroup size的大小,所以title和 workgroup size相等时gpu效率最大,再增大时cpu时间将持续增加,所以title和 workgroup size相等时效率最佳

 实验要求2

cpu执行时间:

parallel_for语句时间

gpu执行时间:

所有时间

### Intel oneAPI 简化版入门教程 #### 一、简介 Intel oneAPI 是一种用于简化应用程序开发的工具集,能够充分利用多种硬件架构的优势。通过提供统一的编程模型,oneAPI 支持开发者编写可以在不同类型的计算资源上高效运行的代码[^1]。 #### 二、安装与配置环境 为了快速启动并体验 oneAPI 的功能,建议按照官方文档指导完成基础设置。通常情况下只需下载对应操作系统的安装包,并遵循提示逐步执行即可。对于初学者来说,可以考虑使用 Docker 或者虚拟机来隔离实验环境[^3]。 #### 三、第一个 SYCL 应用程序 SYCL (pronounced "sickle") 是 C++ 对 OpenCL 的高层封装接口,在保持易用性的前提下提供了更好的性能表现。下面是一个简单的 Hello World 实例: ```cpp #include <CL/sycl.hpp> using namespace sycl; int main() { queue myQueue; std::cout << "Starting..." << std::endl; // 创建缓冲区和命令组 buffer<char, 1> messageBuffer(range<1>(13)); myQueue.submit([&](handler &h) { auto msg = messageBuffer.get_access<handler::access_mode::write>(h); h.single_task<class HelloWorldKernel>([=]() { const char* helloWorldStr = "Hello from DPC++!"; for(int i = 0; i < strlen(helloWorldStr); ++i){ msg[i] = helloWorldStr[i]; } }); }); host_accessor access(messageBuffer, read_only); printf("%.*s\n", 13, static_cast<const char*>(static_cast<const void*>(&(*access.begin())))); return 0; } ``` 此段代码展示了如何利用队列提交任务给设备端处理,并最终获取返回的结果打印到控制台[^2]。 #### 四、调试技巧 当遇到问题时,可以通过集成开发环境中内置的日志记录器查看详细的错误信息;也可以借助第三方库如 Google Benchmark 来评估程序效率瓶颈所在之处。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值