intel c语言编译器,我们可以从英特尔® SPMD 程序编译器中学到什么?

我们已经添加了一个简单的全新SGEMM 示例至英特尔® SPMD 程序编译器 GitHub* 库。英特尔® SPMD 程序编译器俗称为“ISPC”,因为编译器的可执行名称为“ispc.exe”。全新 SGEMM 示例可帮助展示在 ISPC 中优化计算的几种方法。一般而言,单精度一般矩阵乘法 (SGEMM)是一个良好且简洁的示例,许多程序员对它都非常熟悉。拥有 SGEMM 的 ISPC 版本有助于与其他编程语言及其优化 SGEMM 代码的方法进行比较。

总体来说,我们可以从 ISPC 中学到有关编程模型演变的哪些知识?很多!ISPC 流畅地展示了 CPU 多核 SIMD 语言、GPU 计算语言、数据并行 C++ 扩展和嵌入式应用或领域特定计算语言的重要未来发展方向。具体而言,我想讨论 ISPC 如何提供线程级编程并单独介绍 ISPC 如何明确指定 SPMD 迭代范围。

从表面来看,ISPC 似乎是另一种基于内核的单程序多数据 (SPMD) 编程语言,类似于流行的厂商可移植 GPU 计算语言,如 OpenCL*、DirectX* 计算着色器、Vulkan* Compute、Metal* Compute 和 NVidia* 的 CUDA* 语言。这些语言利用被编译为多个实例组合的标量代码内核,针对单指令多数据 (SIMD) 或单指令多线程 (SIMT) 向量计算架构。此类语言支持轻松、高效地生成可向量化汇编代码。如果内核实例之间的数据访问很显然是连续的,那么向量指令集可以高效地将连续数据直接加载至向量寄存器,无需执行更昂贵的标量负载或非连续的收集/分散操作。为了展示这一点,我在 SGEMM 代码变体的内层循环中添加了典型的 ISPC 内核及其 x86-64 codegen 的核心。

99dfac19246eb03e088814b725450f0d.png

一般而言,这些 GPU 计算语言和 ISPC 语言遵循类似的编译策略。  但是,ISPC 和其他语言之间的关键差异在于如何指定内核实例的迭代范围。

我们来看一下 OpenCL 中的编程迭代:应用程序员使用驱动程序 API 来指定“N 维范围”,该范围包括一个分层“全局工作”尺寸,后者聚合了指定为本地“工作组”的子尺寸。尺寸可以是一维、二维或三维。对于高级用户,工作组被进一步细分为“子组”。DirectX* 计算着色器和 CUDA* 拥有相似的抽象。

ND 范围旨在使用简单的抽象简化编程,可加快多个硬件线程和 SIMD 编程。对于执行内核实例的硬件线程组,工作组抽象用于面向共享(本地)内存资源、障碍和原子定义软件至硬件的映射。子组抽象可为程序员提供有关编译器如何针对包含内核实例组合的单个硬件线程的建议。GPU 计算通常提供出色的性能,因此,显然这些计算语言和抽象得到了正确的结果。

但是 CPU 计算语言和这些抽象也会带来不必要的缺点。考虑以下几点:

迭代范围在 API 调用中指定,这些调用分别从计算内核中编译与编程。

一旦内核开始运行索引范围,它们便会被卡住。改变迭代范围需要更多的 API 调用以及调度新内核。

对于新手和专家而言,ND 范围、工作组、子组(线程组、扭曲、波前等)可能是容易混淆的概念。

对于优化 SGEMM 等代码、卷积神经网络或光线跟踪的专家,他们通常需要破坏工作组模式,以直接对硬件线程进行编程,从而管理数据初始化或每个线程资源。

如果您的应用不使用共享本地内存或障碍,或者位于包含高性能高速缓存层级的架构之上,工作组抽象会拥有不必要的复杂性。

在 ISPC语言中,映射至硬件线程和对迭代范围进行编程均是不同的。在 ISPC 中,直接映射硬件线程,并且通过 foreach() 语义在内核代码中直接指定迭代范围。这些看似简单的语言设计选择使线程化和 SPMD 计算编程模型具有优异的属性:

foreach() 前或 foreach() 结构之间的内核代码,可以预测与硬件线程的映射为 1:1。

“直接对硬件线程进行编程”使程序员和编译器更轻松地初始化本地阵列,加载数据块、使用内联函数来执行水平 SIMD 操作,或者更严格地控制寄存器分配。

程序员只需编写一个全新的 foreach() { } 数据块,便可在单个内核中轻松指定多个不同的迭代范围。某些程序员将其称为“改变内核中的并行性轴”。

foreach() 子句中指定的 SPMD 迭代被清楚地映射至单个硬件线程。

在单个内核内,程序员可将 foreach() 嵌套在多个卷积 for() 循环嵌套中。由于它们均在单个内核中编程,编译器仍可以跨越已知的循环边界,做出明智的向量化和优化转换选择。

短常数定义的 SPMD 迭代可以轻易展开,因为迭代范围是已知的。

这些优质属性对于程序员和编译器都非常有用。对于程序员,它支持通过工作组、线程组和子组抽象整理简单、直观的代码。代码直观地映射至硬件,并且能让性能清晰可见。虽然我们相信跨架构性能可移植性是一种错误观念,但是这种代码风格的性能在移植变得更强大。对于编译器,该语言设计非常有效地代表用于高性能机器代码生成的 SPMD 向量化块。

我们呼吁程序员和计算语言设计人员消化吸收这些重要的 ISPC 语言设计选择。设想一下 GPU 计算和 CPU SIMD 语言如何演变以包含类似的内核语言语义,并创建使程序员摆脱工作组和子组抽象束缚的选项。

还有其他许多极具吸引力的 ISPC 语言设计选项值得他们讨论,包括一致/不同的变量说明符、简单的双向 C/C++ 语言绑定、dirt 简单任务和为任务并行性生成的语法等。我们可能在未来的博客中介绍。

点击以下链接以阅读更多文章:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Intel C++ 编译器Windows版》(Intel.C.Plus.Plus.Compiler.v10.0.026)[Bin] 软件版权归原作者及原软件公司所有,如果你喜欢,请购买正版软件 常驻服务器 : DonkeyServer No2, 7x24, 根据工作需要暂停 [版本说明] 截止到2007-08-15为最新版, 仅包含Windows平台, 支持 IA32 / Intel64 / IA64处理器 [病毒检测] NOD32 v2.7 2007-08-15 [安装测试] Windows 2003 SP2 / Visual Studio 2005 SP1 [产品主页] [ http://www.intel.com/cd/software/products/...9578.htm ] [产品简介] 个人翻译, 以原版英文为准: 概要: -------------------------------------------------------------------------------- Intel C++编译器专业版为创建多线程应用程序提供最好的支持。只有专业版才提供对高级优化、多线程和处理器支持(?)。包括自动处理器派发、向量化、自动并行处理、OpenMP*、数据预取、循环展开,还有为并行化、数学运算和多媒体库而高度优化的C++模版。 专业版把高效的编译器Intel® Threading Building Blocks (Intel® TBB), Intel® Integrated Performance Primitives (Intel® IPP) and Intel® Math Kernel Library (Intel® MKL)整合到了一起。虽然这些库也可以单独获取,但是专业版在一个显著折扣价位上为构建稳定高效的并行代码提供了一个强大的基础。 标准版编译器和专业版有着相同的效能和特性, 但是不提供多线程库。 特性: -------------------------------------------------------------------------------- 效能: 考虑使用Intel C++编译器专业版来最佳化效能。内间的优化技术和多线程支持帮助您创建可以在最新的多核处理器上运行best的代码。 高级优化特性: 使用IntelC++编译器Windows版编译的软件可以受益于高级优化特性, 这里有一些简要介绍, 并且链接到完整描述: * Multi-Threaded Application Support, including OpenMP and auto-parallelization for simple and efficient software threading. * Auto-vectorization 并行化代码来利用最新处理器的SSE指令集构架(SSE, SSE2, SSE3, SSSE3, and SSE4)。 * High-Performance Parallel Optimizer (HPO)(高效能并行优化器) 重新组织和优化循环来确定auto-vectorization, OpenMP, or auto-parallelization 最好的利用处理器的缓存、内存访问、SIMD指令集和多核能力。这个由10.0版本而来得新的革命性的能力,组合了向量化、并行化和循环转化到一个比先前分散模块更快、更有效率和更可靠的单个过程。 * Interprocedural Optimization (IPO) 大幅的改善了被频繁使用的中小规模函数的效能,尤其是在循环内包含调用的程序。这个优化器的分析能力还可以对代码弱点和代码错误给出反馈,诸如未初始化的变量或者OpenMP API issues这些严格依赖编译器前端的编译器不能检测到的状况。 * Profile-guided Optimization (PGO) 通过减少指令缓存thrashing、重新组织代码布局、收缩代码大小和降低分支预测失败来改善程序效能。 * Optimized Code Debugging with the Intel® Debugger(使用Intel调试器调试优化后的代码)改善了为Intel架构优化代码的调试过程的效率. 本版本新特性: -------------------------------------------------------------------------------- 此Intel C++编译器Windows版本构建于一个winning foundation之上。它使您能够为下一代硬件创建下一代应用。 改善的效能和Threading * 新的并行/循环优化器 * 改善的C++优化 * 异常处理和类层次分析 安全监测和诊断 * 缓冲区溢出静态验证 * OpenMP API 验证 VISTA 和 Visual Studio 2005 支持 优化报告 支持最新的多核处理器 * Intel® Core™2 Duo processor * Intel® Core™2 Quad processor * Quad-Core Intel® Xeon® processor 5300 series * Dual-Core Intel® Xeon® processor 3000 series * Dual-Core Intel® Xeon® processor 5000 series * Dual-Core Intel® Xeon® processor 7000 series * Dual-Core Intel® Itanium® 2 processor 提供专业版本 Advanced Optimization Features in Depth -------------------------------------------------------------------------------- ... ... 兼容性和适应性 -------------------------------------------------------------------------------- ... ... 可与Microsoft Visual Studio 2005, Visual Studio .NET 2002/2003, and Visual Studio 98集成,并提供扩展的32位和64位多核Intel处理器支持。 Intel C++ 编译器提供下列语言一致性 * ANSI/ISO C 语言标准一致性 (ISO/IEC 9899:1990) * ANSI/ISO C++语言标准一致 (ISO/IEC 14882:1998) * OpenMP 规范版本 2.5 系统需求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值