用户
 找回密码
 立即注册
jynightingale 该用户已被删除
发表于 2011-11-30 16:27:20
63110
本帖最后由 jynightingale 于 2011-11-30 16:27 编辑

    有一个最新的技术发展使得CUDA程序能够透明的编译并全速的在x86架构上运行,这一革新使得CUDA可以像OpenMP一样,成为一种对所有应用程序的开发均可用的编程模型。
    在CUDA, Supercomputing for the Masses Part 21中,我们重点关注了Fermi,其架构的改变不仅显著的拓宽了能高效进行GPGPU计算的程序种类,又保证了那些为上一代支持CUDA的GPU所开发的程序的性能不受损失。本文试图质疑一种传统的思维定势,即认为 CUDA是一种仅服务于GPU应用程序的语言。
    有一个最新的技术发展使得CUDA程序能够透明的编译并全速的在x86架构上运行,这一革新使得CUDA可以像OpenMP一样,成为一种对所有应用程序的开发均可用的编程模型。PGI CUDA C/C++ compiler for x86(来自Portland Group Inc.) 就是使我们改变原有偏见的原因,它是第一个能透明的生成运行在x86处理器上二进制代码的原生CUDA编译器,从此,GPU再也不是必需的。如此一来,现在的开发者只需维护一棵单独的CUDA源代码树,就可覆盖不同硬件配置的用户,无论其拥有支持CUDA功能显卡,或是使用基于x86的系统。

图1展示了用于生成和运行CUDA程序的现有目标平台及相应的编译器选择。
    除了新的CUDA-x86编译器外,其他的产品都需要开发者或者用户的介入来帮助CUDA在各种不同的硬件上执行,如:
    Nvcc是一个NVIDIA公司开发的,可以免费下载获得的编译器,可同时生成主机(Host)代码和设备(Device)代码。通过使用__device__或__host__的声明,开发者可以使得C++ Thrust 库函数在Host以及支持CUDA的设备上均可运行。这一X86的通路在图1中以虚线表示,是因为开发者必须显式的声明(这部分代码)将在Host上运行。不仅如此,开发者还必须显示的检查当前系统是否存在一个GPU,并且依此决定数据是存放在GPU中或者是主机内存中。Thrust API同样支持将CUDA代码透明的编译到不同的后端上,Thrust文档中演示了如何利用OpenMP来在x86上运行蒙特卡洛模拟(Monte Carlo simulation),需要特别注意的是,Thrust并未对生成高效的OpenMP进行优化。(译注:即,Thrust API在x86平台上可利用OpenMP来进行并行,,但可能有性能问题)。
    Gpuocelot 提供了一套动态编译框架来在不同的后端上运行CUDA二进制程序,所能支持的后端包括x86, AMD GPUs,NVIDIA GPUs 以及一个基于x86的PTX模拟器。这一模拟器本身即是一个极有价值的工具,可用来发现CUDA代码中的热点和瓶颈。Gpuocelot网站称其产品“使得CUDA程序可以在NVIDIA GPUs,AMD GPUs,以及x86-Cpus上全速运行,而不需要重新编译。”尽管Ocelot的使用十分困难,但我依然向大家推荐,随着其成熟,它将为消费者提供一种在不同后端上运行CUDA 二进制代码的解决方案。
    MCUDA是一个学术项目,旨在将CUDA源代码翻译成C语言代码,该项目目前并未在维护中(译者注:尚未进入开发阶段),但相关的论文还是非常值得一读。后续有一个名为FCUDA的项目提供了从CUDA到FPGA的翻译能力。
    SWAN提供了从CUDA到OpenCL的翻译能力,但其作者特别强调,SWAN并不可以简单的与NVCC进行替换(译注:即,并非简单的将NVCC替换为SWAN就可以将CUDA代码翻译成OpenCL代码),在Host端代码中,所有的kernel调用及CUDA API调用均需要重新改写。尽管如此,它依然是一个有趣的项目,在CUDA和OpenCL之间构建了一座桥梁。
    这一CUDA-X86编译器(译注:指PGI CUDA C/C++ Compiler for X86)是第一款可以提供一种精确无误的方法来创造一个多平台的应用程序(译注:这里的多平台应用程序指,通过完全相同的代码库,可编译生成各个平台的应用程序。但对于不同的平台依然需要生成不同的二进制文件)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册