新聞中心

EEPW首頁 > 手機與無線通信 > 設計應用 > 基于GPU的AES算法實現(xiàn)

基于GPU的AES算法實現(xiàn)

作者: 時間:2011-06-14 來源:網絡 收藏


2 CUDA編程簡介
2.1 CUDA簡介
CUDA全稱是Compute Unified Device Architecture,是NVIDIA公司在2006年11月推出的一種在上進行通用計算的架構。它具有全新的并行編程模型,不需要像傳統(tǒng)開發(fā)方式那樣進行圖形API的映射就可以使用的資源進行并行計算。CUDA是一個包含軟件和硬件的完整的并行計算架構,它的硬件設備是具有多個流處理器核的圖形并且支持CUDA的GPU,軟件部分包括編譯工具、驅動程序、runtime庫和一些常用的數(shù)學運算庫。
2.2 CUDA中GPU結構
在CUDA架構下,開發(fā)者可以通過創(chuàng)建和管理大量的線程來使用GPU的硬件資源進行并行計算。在CUDA中線程的創(chuàng)建和切換是由硬件來的,不會占用軟件的執(zhí)行時間。在CUDA的rtmtime庫中提供了訪問GPU硬件資源的接口,用戶通過調用runtime庫中的函數(shù)就可以直接訪問GPU的硬件資源。CUDA的編程語言是一種C語言的擴展,提供了通用的DRAM尋址方式,從而提供了很大的編程靈活性。操作系統(tǒng)可以管理多個并發(fā)運行的CUDA程序和圖形應用程序來訪問GPU。

3 CUDA編程模型
由于GPU的特點,它很適合做高密度數(shù)據的并行運算,但是對于不能并行的具有復雜執(zhí)行路徑的程序執(zhí)行效率就會很低。因此當通過CUDA在GPU上進行通用計算的開發(fā)時,是把在應用程序中高密度數(shù)據可以進行并行計算的部分做成一個稱作kernel的函數(shù)在GPU設備上執(zhí)行,而應用程序中的其他串行執(zhí)行的部分由主機上的CPU來完成。一個在GPU上執(zhí)行的kernel可以包含極高數(shù)量并發(fā)執(zhí)行的線程,在CUDA架構中是通過設計kernel中的線程來完成通用計算的GPU的。主機和GPU設備之間的交互是通過在主機和設備各自的DRAM之間傳輸數(shù)據來的,而這種數(shù)據傳輸是由設備的DMA引擎完成的,因此數(shù)據的傳輸并不會造成太多主機CPU開銷。
一個kernel中的線程是被分成具有相同大小的線程塊的,線程塊可以是一維、二維或者三維的,因此對應的線程就可以具有一維、二維或者三維的索引。在一個線程塊中每個線程都具有一個一維的ID,這個ID和索引具有以下kernel關系:對于一維的線程塊,線程就等于其索引;對于大小為ID(Dx,Dy)的二維線程塊,索引為(x,y)的線程ID為(x+v Dx);對于大小為(Dx,Dy,Dz)的三維線程塊,索引為(x,y,z)的線程ID為(x+y Dx+z Dx Dy)。
同一個線程塊中的線程之間可以通過同步操作來協(xié)同內存訪問。當通過調用內置函數(shù)_syncthreads()在kernel中建立同步點時,一個線程塊中的執(zhí)行到同步點的線程會被掛起直到這個線程塊中所有的線程都到達這個同步點。
為了線程之間能夠有效地協(xié)同工作,同步操作被設計成只需要一條指令就可以實現(xiàn),并且同一個線程塊中的線程需要在同一個多核處理器上執(zhí)行。因此每個線程塊中全部線程的數(shù)量就受到一個處理器核上的存儲資源的限制。在當前的GPU上,一個線程塊可以包含最多512個線程。
雖然一個線程塊可以包含的線程數(shù)量有限制,但是一個kernel可以包括多個大小相同的線程塊,kernel中的線程數(shù)就等于每個塊中線程的數(shù)量乘以線程塊的數(shù)量。線程塊之間是獨立的,它們可以并行地執(zhí)行,也可以串行地順序執(zhí)行。這就允許線程塊在多個處理器核之間按照任何順序調度,從而使得開發(fā)具有靈活性和可擴展性。而且這樣線程塊的數(shù)量就可以根據待處理數(shù)據的大小決定,而不是由系統(tǒng)中多核處理器的個數(shù)決定,也就是說線程塊的數(shù)量可以大于多核處理器的數(shù)量。因此kernel中可以具有大量的線程塊,從而具有極高的線程數(shù)。但是由于線程塊之間執(zhí)行的不確定性,不同線程塊的線程之間不能進行同步操作。
3.1 設計
首先把待處理的大數(shù)據塊劃分為尺寸相同的多個小數(shù)據塊,然后使用標準的對各個小數(shù)據塊進行并行的運算,運算完成后把每個小數(shù)據塊的值按順序保存在一起,最后再把所有的輸出結果使用標準的來處理得到最后的結果,這樣就可以使用大量的線程來并行地對每個小數(shù)據塊進行運算。但是當數(shù)據分塊足夠多線程數(shù)很大時,就需要將線程劃分為多個線程塊。由于不同線程塊中的線程之間不能進行同步,所以設計了兩個kernel,第一個kernel的任務是使用大量并發(fā)執(zhí)行的線程對原始數(shù)據分成的多個小塊數(shù)據進行運算,并把結果按照順序保存在設備DKAM中。等第一個kernel執(zhí)行完成后,由主機啟動第二個kernel,這個kernel會根據主機提供的地址和數(shù)據大小對第一個kernel的計算得到的中間值進行運算,這一步只需用一個線程來執(zhí)行,由于中間值的大小遠遠小于原始數(shù)據,所以這一步的計算開銷是很小的。
3.2 算法優(yōu)化
GPU計算雖然高效,但是也有瓶頸。CPU代碼在調用GPU的kernel函數(shù)時,首先要將內存中的數(shù)據塊讀到流中,處理完后,又要將流寫回內存。


評論


相關推薦

技術專區(qū)

關閉