趙盛 最後更新時間 12/27/2018 2:31 PM程序員
1.1 什麼是並行計算?編程
即一個大的計算問題被劃分爲不少能夠同時解決的小問題。網絡
1.2 什麼是數據相關性?多線程
一個程序應該包含兩個基本的組成部分:指令和數據。當一個指令處理上一個指令產生的數據時,就有了數據相關性(依賴性)的概念。
數據相關性是限制並行性的主要因素。架構
1.3 什麼是數據並行?分佈式
即同時處理許多數據。數據並行處理能夠將數據映射給並行線程。函數
1.4 如何把數據依據線程進行劃分?性能
塊劃分 block partitioning:一組連續的數據組成一個數據塊,一個線程在同一時間一般只處理一個數據塊。數據塊以任意次序安排給一個線程。
週期劃分 cyclic partitioning:一個數據塊可能只包含一組連續數據中的一部分,數據塊按週期排列,相鄰線程處理相鄰數據塊,每一個線程能夠處理多個數據塊。線程選擇一個新塊意味着要跳過和現有線程同樣多的數據塊。優化
塊劃分和週期劃分的選擇與計算機架構有關。spa
1.5 什麼是弗林分類法 Flynn’s Taxonomy:
一種普遍使用的計算機架構分類方法:
1.6 什麼是SIMD(單指令多數據)架構?
SIMD是一種並行架構,指具備多個核心的計算機,在任什麼時候間點全部核心只有一個指令流處理不一樣數據流。(向量機是一種典型SIMD計算機)
SIMD的最大優點在於,在cpu上編寫代碼,程序員能夠繼續按照串行邏輯思考但對並行數據操做實現並行加速,其餘細節由編譯器來負責
1.7 一些量化變量?
延遲:衡量完成一次操做的時間,用微秒錶示。
帶寬:衡量單位時間內能夠處理的數據量,用MB/s或GB/s表示。
吞吐量:衡量單位時間內成功處理的運算(操做)數量,用gflops(每秒十億次浮點運算數量)表示。
1.8 經過內存組織方式劃分計算機架構?
分佈式內存的多節點系統:大型計算引擎由許多經過網絡鏈接的處理器構成,每一個處理器具備獨立的本地內存,彼此經過網絡通訊,這一般被稱爲集羣。
共享內存的多處理器系統:即大小在雙處理器到上百處理器之間。這些處理器要麼是與一個物理內存相關聯,要麼公用一個低延遲鏈路(PCIE)。儘管共享內存意味着共享地址空間,但並不意味着它就是一個獨立的物理內存。
1.9 什麼是GPU衆核系統?
GPU幾乎包括了前文所述全部並行結構,NVIDIA將其定義爲SIMT(單指令多線程)架構。
1.10 簡單區分CPU核心和GPU核心?
CPU核心少但重,用來處理很是複雜的控制邏輯,以優化串行程序。
GPU核心多但輕,因爲優化簡單控制邏輯的數據並行任務,注重數據吞吐。
即兩頭公牛和1024只小雞的故事。
2.1 同構計算和異構計算的區別?
同構計算使用的是同一架構下的一個或多個處理器執行一個應用
異構計算使用一個處理器架構來執行一個應用。爲應用(任務)選擇適合的架構,最終對性能有所改進。
2.2 什麼是異構架構?
一個典型的異構計算節點包括兩個多核CPU插槽和多個衆核GPU。GPU不是一個獨立運行平臺而是CPU的協同處理器。GPU必須經過PCIE總線和CPU相連。異構架構中CPU被稱爲主機端,GPU被稱爲設備端。
CPU和GPU具備功能上的互補性,二者有效結合能使應用程序得到最佳運行效果。爲此NVIDIA設計CUDA來支持CPU-GPU異構系統。
2.3 什麼是異構應用?
一個異構應用包括兩個部分:主機代碼(CPU)和設備代碼(GPU)。
異構應用一般由CPU初始化。這設備端加載計算密集型任務以前,CPU代碼負責管理設備端的環境,代碼和數據。
在計算密集型應用中,每每有不少並行數據的程序段,GPU用來提升這些並行數據的執行速度。
2.4 用來描述GPU的量化變量
描述GPU容量的指標:CUDA的核心數,內存大小。
評估GPU性能的指標:峯值計算性能(GFlops),內存帶寬(GB/s)。
另外NVIDIA使用「計算能力「 compute capability來描述GPU的硬件性能。
2.5 用GPU輸出Hello World
通常狀況下,在CPU中運行的helloworld程序以下:
#include <stdio.h> int main(){ printf(「hello world from CPU!\n」); }
而在GPU中運行,首先須要編寫內核函數
__global__ void helloFromGpu() { printf("hello world from GPU!\n"); }
修飾符__global__告訴編譯器這個函數會從CPU中被調用,而後在GPU上被執行。
用helloFromGpu << <1, 10 >> > ()啓動10個線程執行內核函數,全部線程執行相同代碼。
函數cudaDeviceReset();用來顯式釋放和清空當前進程中與設備有關的全部資源
完整代碼以下
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> __global__ void helloFromGpu() { printf("hello world from GPU!\n"); } int main() { helloFromGpu << <1, 10 >> > (); cudaDeviceReset(); return 0; }
運行結果:
hello world from GPU! hello world from GPU! hello world from GPU! hello world from GPU! hello world from GPU! hello world from GPU! hello world from GPU! hello world from GPU! hello world from GPU! hello world from GPU!
2.6 CUDA的編程結構(流程)