(实时更新)
目录
实验四补充
一,环境搭建
注册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_selector
和 sycl::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
对象 acc
将 B
绑定到 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执行时间:
所有时间