英特尔 oneAPI —— 实现COO格式稀疏矩阵乘积openMP并行化
英特尔 oneAPI 介绍
英特尔 oneAPI 相当于一个超级组件,结合了CPU、GPU、FPGA等等,提供了不同架构和不同硬件的环境,为程序员提供了跨架构的开发能力。
它包括了 oneAPI 标准组件、含有一系列性能库的基于 API 的编程工具,以及先进的分析、调试工具等组件。开发人员可以在英特尔 DevCloud for oneAPI 上对基于多种英特尔架构的代码和应用进行测试。为开发人员的开发提供了相当的便利条件。
提供官网地址:https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/toolkits.html
限于笔者水平有限,其它介绍请参考:
https://blog.csdn.net/cjh521xqy/article/details/119668640
https://blog.csdn.net/weixin_44506674/article/details/110990718
实验说明:
本文是基于Intel oneAPI工具实验环境下测试COO格式稀疏矩阵的并行化思路,作者总共实现了SIMD向量化,pThread多线程,openMP多线程三种并行化思路,这里以openMP为例进行详细说明,具体实验环境配置和实验设计思路如下:
spMV的openMP并行
静态线程分配的并行化
首先分析程序,在原有COO格式的稀疏矩阵的基础上再添加指向每一行第一个元素的指针,基于这种存储格式,我们设计串行算法:
int i,j;
for(i=0;i<nozerorows;i++)
{
for(j=index[i];j<index[i+1];j++)
{
yy[row[j]]+=value[j]*vec[col[j]];
}
}
在这种算法的基础上进行openMP编程,首先分析程序的依赖关系,其中外层是一个可以进行并行划分的部分内层由于yy[row[j]]
写入数据造成的数据冲突,不太好实现并行化。
int i,j;
#pragma omp parallel num_threads(OMP_NUM_THREADS),private(i, j)
#pragma omp for
for(i=0;i<nozerorows;i++)
{
for(j=index[i];j<index[i+1];j++)
{
yy[row[j]]+=value[j]*vec[col[j]];
}
}
动态线程分配的并行化
int i,j;
#pragma omp parallel num_threads(OMP_NUM_THREADS),private(i, j)
//#pragma omp for schedule(static, nozerorows/OMP_NUM_THREADS)dynamic, 50
#