使用 Jupyter 在 Intel® DevCloud 上开始使用 oneAPI





5.00/5 (1投票)
在本文中,我们将演示如何设置 Intel DevCloud 并开始使用 oneAPI,同时展示 oneAPI 的一些独特功能。
随着编程世界的飞速发展,无数种编程语言和架构涌现并被取代,以跟上开发需求。随着语言和范式的不断变化,我们程序员花费大量时间重写相同的脚本,几乎没有时间或能力专注于学习、优化和创新。
Intel 的 oneAPI 可以成为忙碌开发者的救星。新的统一编程模型保持行业标准,同时提供跨平台功能和跨架构的通用体验。oneAPI 使开发人员能够结合用户 CPU、GPU、FPGA 和其他加速器的处理能力,并行运行进程。并行执行可以提供更好的性能、效率、响应能力等。
Intel DevCloud 使我们能够充分利用 oneAPI 在各种加速器类型上的潜力。您可以立即在 Intel DevCloud 上访问 oneAPI Base Toolkit,或者将其下载并部署到您的本地计算机上。
在本教程中,我们将构建一个使用 oneAPI 的 DPC++ 程序,然后使用 Intel DevCloud 进行测试。我们的程序将执行两个 32 位浮点向量的点积,并将结果存储在第三个向量中。
我们将首先演示如何注册 Intel DevCloud。然后,我们将研究基于 C++ 和 SYCL 的 Data Parallel C++ (DPC++) 编程语言,它支持跨异构架构的并行编程。我们将执行点积乘法,同时为各种工作负载使用各种加速器(如 CPU、GPU 和 FPGA 等异构架构)。
要跟随本教程,您应该对 C++ 有充分的了解。您也可以下载完整的代码进行跟随。
创建 Intel DevCloud 帐户
我们的目标是了解 Intel 的 oneAPI,它使用了 DPC++ 以及其他特定领域的库和调试工具。由于我们使用的是云,我们只需要一个浏览器和稳定的互联网连接。或者,您可以使用 SSH 连接来解锁 oneAPI DevCloud 的强大界面,尽管在本教程中我们将坚持使用浏览器。
首先,访问 Intel DevCloud 并点击 **Enroll** 按钮。填写 DevCloud 帐户所需的所有必要信息。
在 **More About you** 页面上,输入所需信息。选择 **HPC Workloads** 作为您使用 Intel DevCloud 的目的。
点击 **Next** 后,Intel 会向您的电子邮件发送一个验证链接。使用该链接验证您的帐户,然后您将被重定向到 **Sign In** 页面,并看到一个类似这样的 DevCloud 登录页面。
设置开发环境
Intel DevCloud 提供三种开发和执行环境供选择:Secure Shell (SSH) Direct Connection、JupyterLabs 以及用于渲染工具包节点的远程桌面解决方案。我们将使用 JupyterLabs 来学习 oneAPI 和 DPC++ 编程。
首先,访问 **Working With oneAPI** 页面,并同意软件要求和条款。
点击 **Submit** 后,Intel 会将您重定向到 oneAPI Get Started 页面。滚动到页面底部,然后点击 **Launch JupyterLab**。
当 JupyterLab 启动时,它会提示您选择一个内核。选择 **Python 3.7 (Intel oneAPI)**。然后会出现一个带有 _welcome.ipynb_ 的 Jupyter notebook,其中包含 oneAPI 和 DPC++ 所需的所有文档。
为了方便起见,请切换到 Jupyter notebook 中的现有路径
/oneAPI_Essentials/01_oneAPI_Intro/
现在我们将创建一个新的 notebook。点击左上角的 **+** 按钮,然后选择 **Python 3.7 (Intel oneAPI)**。
点击 notebook 上的 **+** 按钮,创建两个新单元格。第一个单元格用于代码,第二个单元格用于编译和将作业提交到 DevCloud。
我们创建了一个 Python Jupyter notebook,所以它只能理解 Python 代码。如果我们尝试直接编译 DPC++,我们会从第一行收到语法错误。因此,我们instead将 _ .cpp_ 文件放入一个名为 _lab_ 的文件夹中,并在单元格中提供文件位置。当我们运行单元格时,它会用我们添加的代码覆盖原始的 _ .cpp_ 文件。
在本示例中,我们将创建一个简单的程序,该程序对两个向量执行浮点向量乘法,然后将结果存储在第三个向量中。因此,请在 lab 文件夹中创建一个 _vector-multi.cpp_ 文件。
使用 oneAPI 编码跨平台程序
现在让我们探讨如何为我们的程序实现 oneAPI 和 DPC++ 类和函数,以实现跨架构功能。
设置头文件和全局变量
让我们从程序的头文件和全局元素开始。我们使用 _sycl.hpp_ 文件进行所有内核和并行处理。此外,我们声明常量 N
作为向量的维度。
%%writefile lab/vector-multi.cpp
#include <CL/sycl.hpp>
using namespace sycl;
static const size_t N = 3;
声明工作函数
接下来,我们声明将在 main
函数中调用的 work
函数。(我们必须在 main
函数之前声明它,否则我们会收到“未声明的标识符”错误。)
该代码从 main
函数中选择 XPU(CPU、GPU 或 FPGA)队列,然后将队列传递给 work
函数,我们将使用该函数来处理这些向量。我们为每个向量创建缓冲区和访问器,处理程序可以轻松访问和使用它们来进行并行处理。此外,我们还有 queue submit
和 wait
函数,它们将工作负载发送到内核进行并行处理,并管理内核的唤醒和睡眠周期。
void work(queue &q)
{
std::cout << "XPU Device : "
<< q.get_device().get_info<info::device::name>()
<< std::endl;
auto R = range(N);
float vector1[N] = {1.1,2.2,3.3};
std::cout << "Input : " << vector1[0] << ", " << vector1[1] << ", " << vector1[2] << std::endl;
float vector2[N] = {1.1,2.2,3.3};
std::cout << "Input : " << vector2[0] << ", " << vector2[1] << ", " << vector2[2] << std::endl;
float vector3[N] = {0,0,0};
buffer vector1_buffer(vector1,R);
buffer vector2_buffer(vector2,R);
buffer vector3_buffer(vector3,R);
q.submit([&](handler &h) {
accessor vector1_accessor (vector1_buffer,h,read_only);
accessor vector2_accessor (vector2_buffer,h,read_only);
accessor vector3_accessor (vector3_buffer,h);
h.parallel_for<class multiplication>(range<1>(N), [=](id<1> index) {
vector3_accessor[index] = vector1_accessor[index] * vector2_accessor[index];
});
});
q.wait();
host_accessor h_a(vector3_buffer,read_only);
std::cout << "Vector Multiplication Output : " << vector3[0] << ", " << vector3[1] << ", " << vector3[2] << std::endl;
}
添加主函数
main
函数可以根据处理器声明各种队列。如果我们想在 Intel GPU 上运行它,我们会取消注释它,然后注释掉 CPU 选择器队列。相同的代码将在不同的架构上运行,而无需重写!我们还将所有代码放入 try-catch 块中,以启用任何潜在的错误处理。
int main()
{
try {
//uncomment the selector that you want to use
//gpu_selector selector;
cpu_selector selector; //the active selector
//default_selector selector;
//host_selector selector;
queue q(selector);
work(q);
}
catch (exception e) {
std::cerr << "Exception: " << e.what() << std::endl;
std::terminate();
}
catch (...) {
std::cerr << "Unknown exception" << std::endl;
std::terminate();
}
}
在 DevCloud 中执行代码
由于 Jupyter notebook 仅运行 Python 代码,请将下面的代码添加到下一个单元格中,以允许将您的作业发布到 DevCloud。它包含 chmod
命令,用于授予我们将要创建的 _run_vectormultiplication.sh_ 文件读/写权限。
单元格代码
! chmod 755 q; chmod 755 run_vectormultiplication.sh; if [ -x "$(command -v qsub)" ]; then ./q run_vectormultiplication.sh; else ./run_vectormultiplication.sh; fi
在与 Jupyter notebook 相同的文件夹中创建一个 _run_vectormultiplication.sh_ 文件,然后将下面的代码添加到该文件中。此代码在 DevCloud 中编译 DPC++ 程序,并输出 notebook 向量乘法的相关输出。它包含 DPC++ 编译器所需的所有命令。
#!/bin/bash
source /opt/intel/oneapi/setvars.sh > /dev/null 2>&1
/bin/echo "##" $(whoami) is compiling DPCPP_Essentials Module1 -- oneAPI Intro sample - 1 of 2 vector-multi.cpp
dpcpp lab/vector-multi.cpp -o bin/vector-multi
if [ $? -eq 0 ]; then bin/vector-multi; fi
前三行是用于云用户验证和 DPC++ 编译所需环境设置的命令。在第 4 行,dpcpp
命令编译给定的 _ .cpp_ 文件,并将对象文件存储在 -o
选项指定的路径中。
要运行 DevCloud 中的 oneAPI/DPC++ 代码,请按照以下步骤操作
- 在 Python Jupyter notebook 中创建一个单元格,并提供文件位置,以便将下面的代码覆盖到该文件中。将 _ .cpp_ 文件保存到文件夹中,并在单元格中提供其位置。
- 要编译和执行 Python Jupyter notebook 中的代码,请使用上面提到的 shell 脚本代码创建 shell 脚本文件,并使用任何与您的程序相关的名称。上面的代码包含 _ .cpp_ 文件位置和 DPC++ 库,使其能够编译并将作业提交到 Intel DevCloud。
- 在 Jupyter notebook 中创建第二个单元格,并使用
chmod
代码片段授予读/写权限并启用作业提交到 DevCloud。然后 DevCloud 可以编译 .cpp 代码并发送相关输出。
上方的截图显示我们的程序已成功将向量相乘并将结果存储起来。它在 30 秒内快速完成,结合了我们的 CPU 和 GPU 的处理能力。
后续步骤
oneAPI 提供了跨架构编程所缺失的组件,更易于实现的库,以及为开发人员探索提供的广阔空间。要进一步使用 oneAPI,我们可以尝试在 CPU、GPU 和 FPGA 上对所有不同方法进行数组排序。
虽然我们这里运行了一个简单的程序,但这些相同的方法可以帮助加速更复杂的任务,例如更长的向量列表、机器学习或高性能计算 (HPC) 进程。尝试 oneAPI,结合所有可用处理器的功能,以获得更快、更强大的应用程序。
资源
- Intel DevCloud – oneAPI Public
- 入门指南
- oneAPI
- 262 个节点群集
- 246 个 Intel® Xeon®
- 78 个 Intel® Xeon® E-2176G 处理器/Gen9 GPU
- 133 个 Intel® Xeon® Gold 6128 处理器
- 6 个 Intel® Xeon® Gold 6348 处理器
- 12 个 Intel® Arria® 10 FPGA
- 4 个 Intel® Stratix® 10 FPGA
- 13 个 Intel® Iris® Xe MAX Graphics
- 15 个 Intel® Core™
- DRAM – 32GB -> 392GB
- 246 个 Intel® Xeon®
- 否 - 高速互连
- 提供多个 oneAPI 版本
- setvars.sh 选择机制
- 默认加载最新 (2021.4) oneAPI 版本
- PBS Torque
- 更多资源
Intel DevCloud – oneAPI Public
访问 必备组件 |
|
支持 | 论坛 - https://software.intel.com/en-us/forums/intel-devcloud |
区别 |
|