英特尔oneAPI实现简单矩阵运算 |
您所在的位置:网站首页 › 矩阵的ldu分解唯一性 › 英特尔oneAPI实现简单矩阵运算 |
##英特尔oneAPI 随着计算机系统结构的更新迭代,CPU、GPU等各种硬件结构也快速发展,硬件的多样性亟待开发者的维护。同时,并行计算在多个硬件平台中进行的复杂度较高,计算效率受到影响,这种状况亟待改善。面对如此状况,英特尔推出了oneAPI,通过oneAPI工具集帮助开发人员在不同硬件结构上进行高性能并行计算。 英特尔推出的oneAPI是一个统一的、简化的编程模型,用来实现多个架构开发过程的简化。oneAPI包括了一系列通用的编译器、库和工具,让开发者可以自由选择架构,无需在性能上作出妥协,大大降低了使用不同的代码库、编程语言、编程工具和工作流程所带来的复杂性。 oneAPI 包括多个工具包,如可用于开发高性能应用程序的Intel oneAPI Base Toolkit,可在共享和分布式内存计算系统上构建、分析和扩展应用程序的Intel oneAPI HPC Toolkit,以及Intel System Bring-up Toolkit,Intel oneAPI IoT Toolkit,Intel oneAPI Rendering Toolkit,Intel Distribution of OpenVINO toolkit,Intel AI Analytics Toolkit。API包含的这六个工具包,几乎覆盖了高性能计算、物联网、渲染、人工智能和大数据分析等领域。 接下来的部分为用oneAPI实现的简单矩阵乘法运算: 在代码中,以两个10阶矩阵乘法为例:首先创建了ABC三个矩阵,AB为两个相乘的矩阵,C为矩阵乘法的结果。接下来创建SYCL队列以及SYCL缓冲区,SYCL缓冲区用于存储矩阵数据。myQueue.parallel_for()是实现并行计算的核心,其中,range{10,10}表示执行范围从(0,0)到(9,9),即一个10阶方阵的左上角到右下角Index即为循环对象的名,id表示该二维矩阵的运算是二维的。最后,将矩阵C(即得到矩阵乘法的结果)循环输出。 ```c++ #include #include using namespace cl::sycl; int main() { queue Q{ default_selector{} }; std::vector A(10 * 10, 1.0f); std::vector B(10 * 10, 2.0f); std::vector C(10 * 10, 0.0f); buffer bufferA{ A.data(), range{10, 10} }; buffer bufferB{ B.data(), range{10, 10} }; buffer bufferC{ C.data(), range{10, 10} }; Q.submit([&](handler& M) { auto a = bufferA.get_access(M); auto b = bufferB.get_access(M); auto c = bufferC.get_access(M); //矩阵乘法并行化 M.parallel_for(range{ 10, 10 }, [=](id index) { float sum = 0.0f; for (size_t i = 0; i < 10; ++i) { sum += a[index[0]][i] * b[i][index[1]]; } c[index] = sum; }); }); Q.wait(); std::cout std::cout |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |