首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 gKrypt 快速保护您的数据(2)

使用 gKrypt 快速保护您的数据(2)

针对 CUDA 架构的并行 AES 算法现在您已经了解了一些 AES 加密算法的知识。可以开始用 CUDA 框架实现点什么了。在下面的几节中,我会简要介绍 CUDA 框架,然后详细讨论设计方法和实现机制。这些都是准备工作,所以您可以运行本系列文章第二部分中的示例。
CUDA 架构CUDA 于 2006 年引入,是由 NVIDIA 开发的一种并行计算架构,通过充分利用 NVIDIA GPU 的计算能力来提高计算性能(参阅 )。市面上已安装的一亿多个 GUP 均支持 CUDA,所以在 CUDA 上运行的应用程序已经有了很庞大的潜在用户群。CUDA 发布后,开发人员已经在很多应用程序中实现了显著的性能改进,特别是与图像处理和高清视频播放有关的应用(见 )。
图 10. CUDA 线程模型CUDA 编程模型的概念是生成按单程序流多数据流 (SPMD) 方式并行执行的数千个线程,每个线程都在一小块数据上执行操作。由于 GUP 的核心数要多于 CPU(尽管 GPU 核心的处理能力要远低于 CPU 的核心),因此是并行执行数千个线程的理想之选,此时每个线程都在一小块数据上进行计算。这些线程被组织成多个块和网格 (grid),其中一个线程块是一组线程,而一个线程网格则是一组线程块。CUDA 架构(其所有功能及内存层次结构)都需要详细说明,但这超出了本文的范围。
设计策略如前所述,AES 是一种分组密码算法,独立地在 128 位的数据块(状态)上进行操作。由于 AES 加密在每个状态块上执行相同的操作,并且每个块之间没有依赖关系(ECB 模式),所以它提供了很高的数据级别并行性。我实现了一种分叉与汇合的策略来利用 AES 分组密码中的这种数据级别的并行性。在该方法中,可同时加密多个状态块,每个线程负责一个状态块,因此可实现更高的吞吐量。由于数据规模越大,并行性级别也越高,所以执行批量加密时 GPU 要更为高效。
显示了主机-设备工作分区并介绍了 AES 各部分的本质。从中可以看出,AES 中惟一的串行操作是为后续 AES 轮次提供轮次密钥的密钥编排操作。所有 AES 转换都是高度并行性的操作,因为会为每个 128 位状态块单独应用这些转换操作。因此可以将工作分布在 CUP 主机处理器和 GPU 设备上,让这种实现方法获得最高的吞吐量。因此,在 CPU 设备上执行密钥编排操作一次,然后将结果作为内核参数传递到 GPU 设备。然后使用 CUDA 实现核心 AES 算法(即各种 AES 转换),目的就是充分利用 GPU 的并行计算资源。
图 11. 主机-设备工作分区在本系列文章第二部分介绍的实现中,每个 CUDA 线程将一个状态块(16 字节)作为输入内容,通过应用指定数量轮次的面向字节的 AES 转换,将其转换为密码-文本。一个 128 位状态块的加密操作仍是串行的;但是您可使用 GPU 特定的优化技术(如循环展开)来优化代码。在访问输入数据和写回加密后的数据时,每个 CUDA 线程有一个 16 字节(一个状态块)的净偏移量。 显示了线程间的工作分区以及该实现方法使用的线程分配模型。
图 12. CUDA 线程分配CUDA 设备上的线程执行从理论上讲,您可能认为加密 100 MB 数据所需的时间与加密 128 位数据所需的时间相同,因为所有线程都是同时执行的,但情况并非如此。您已经知道在 CUDA 中会将多个线程绑定成块在 CUDA 设备上执行操作。在目前的 CUDA 架构中,执行资源(核心)被分为多个流式多处理器 (SM),并且每个 SM 一次可执行 112 个块(见 )。如果设备有 14 个 SM(Tesla C2050 就是如此,每个 SM 有 32 个核心),那么一次只能执行 16 个块,前提是没有其他限制因素。如果块的数目多于 16 个,后续的块就必须等待轮到它们执行。这是设备上最简单的线程执行情况。还有很多其他因素需要考虑,如每个 SM 的线程束 (warp) 数目、每个线程的寄存器使用情况、每个块的共享内存等。有关 CUDA 如何为 SM 分配线程块的更多信息,请参阅 CUDA Occupancy Calculator(参阅 )。
图 13. 将线程块分配给流式多处理器 (SM)在目前的 CUDA 架构(仍在不断发展)中,一旦将某个线程块分配给流式多处理器,就会将该线程块分为多个线程束,每个线程束中有 32 个线程。这些线程束可能不会并行执行操作,但它们的确以非常高效的方式执行操作。例如,如果一个线程束正在等待内存转换,此时下一个线程束会在此时同一核心上执行其数据操作。如果有多个线程束已准备好执行操作,驱动程序会在这些线程束之间设定一个优先级机制。虽然核心数可能会少于一个内核中所启动的线程数,但 CUDA 架构和驱动程序可确保使用所有硬件资源,从而实现最高的性能。
在 Linux 上配置 CUDACUDA 框架需要基于 NVIDIA 的图形处理单元 (GPU) 才能充分利用底层的并行硬件并实现高性能。CUDA 运行时附带了一个 NVIDIA 开发人员视频驱动程序。要想使用具有 CUDA 功能的显卡,第一步是配置基本的视频驱动程序。请打开终端并执行以下命令:$ sudo apt-get --purge remove nvidia*。
下一步是将那些与 CUDA 开发人员驱动程序发生冲突的默认 nouveau 驱动程序加入黑名单。在 /etc/modprobe.d 中新建一个文件并在该文件中插入  中所列的代码。
清单 1. 将那些与 CUDA 开发人员驱动程序发生冲突的默认 nouveau 驱动程序加入黑名单
1
2
3
4
5
6
7
# /etc/modprobe.d/blacklist-nouveau.conf
blacklist nvidiafb
blacklist nouveau
blacklist rivafb
blacklist rivatv
blacklist vga16fb
options nouveau modeset=0




要更新内核文件,可运行此命令:$ sudo update-initramfs -u
然后重新启动系统,让修改生效。系统重新启动后,就可以安装 CUDA 开发驱动程序了。
安装 CUDA 驱动程序您可直接从 NVIDIA 网站下载最新的 CUDA 驱动程序官方发行版(参阅 )。必须先关闭图形显示管理器,然后才能继续安装工作。要想切换到控制台模式,可按 CTRL+ALT+F2 组合键。现在可从控制台开始驱动程序文件的自动安装过程:$ sudo sh devdriver_4.1_linux_32_285.05.32.run。
安装完驱动程序后,重启系统,并通过可显示当前已安装的 GUP 的 Administration 菜单验证  X Server 正在运行。
返回列表