2013-05-14 94 views
0

我爲CPU(C++)和CUDA中的同一程序編寫了兩個單獨的代碼。我不知道爲什麼CUDA代碼的加速比CPU代碼少。
我有三個矩陣H,E,F並且對它們進行操作。 CPU代碼中的加速時間爲0.004秒,CUDA代碼中的加速時間爲:矩陣的尺寸爲32 * 32時的0.006秒。在內核代碼中,我定義了三個共享內存變量matrix_H,matrix_E,matrix_F並將dev_H,,dev_F值從全局內存分配到共享內存以加速內存訪問時間並最終將計算出的共享內存變量複製到全局內存中。
這是因爲內核調用或其他地方有很多參數?寫入CUDA代碼的低加速度

__global__ void kernel_ScoreMatrix(char *dev_seqA, char *dev_seqB, 
    int *dev_H, int *dev_E, int *dev_F, int *dev_i_side, int *dev_j_side, 
    int *dev_lenA, int *dev_idx_array, int *dev_array_length) 
{ 
    __shared__ int matrix_H[1024]; 
    __shared__ int matrix_E[1024]; 
    __shared__ int matrix_F[1024]; 

    int x= threadIdx.x; 
    int y= threadIdx.y; 

    //calculate current_cell that execute with threads 
    int current_cell = *(dev_lenA)*(y) + x; 

    matrix_H[current_cell]=dev_H[current_cell]; 
    matrix_E[current_cell]=dev_E[current_cell]; 
    matrix_F[current_cell]=dev_F[current_cell]; 

    int index=0; 

    int scoreMatrix[4]; 

    //for determine cells that must compute in this time 
    for (int i=0; i<*(dev_array_length); i++) 
    if (current_cell== dev_idx_array[i]){ 
      scoreMatrix[0] = H_Matrix(current_cell, x, y, matrix_H, dev_seqA, dev_seqB, dev_lenA); 
      scoreMatrix[1] = E_Matrix(current_cell, matrix_E, matrix_H, dev_lenA); 
      scoreMatrix[2] = F_Matrix(current_cell, matrix_F, matrix_H, dev_lenA); 
      scoreMatrix[3] = 0; 
      dev_H[current_cell] = findMax(scoreMatrix,4, index); 
} 

在主要功能:

dim3 threadsPerBlock(32, 32); 
kernel_ScoreMatrix<<<1,threadsPerBlock>>>(dev_seqA, dev_seqB, dev_H, dev_E, dev_F, 
     dev_i_side, dev_j_side, dev_lenA, dev_idx_array, dev_array_length); 
+4

這是因爲你正在運行一個塊。這隻會利用CUDA GPU的一小部分總容量。我沒有看到這個問題對任何人都會有多大好處,並且已經投票決定將其視爲過於本土化。 – talonmies

+0

我正在同時運行一個塊(2.x計算能力設備中的1024個線程)中的所有線程。我需要1024個線程的更多塊?你可以解釋嗎?除非1024個線程不適合塊? –

回答

4

甲threadblock by definition執行在單個SM。因此,不管線程塊有多少個線程包含,您可用於執行該特定線程塊的執行資源都是該(單個)SM中的資源。由於幾乎所有NVIDIA GPU都包含多個SM,爲了使GPU保持繁忙(這是獲得性能所必需的),因此有必要啓動具有多個線程塊的網格。一個合理的經驗法則是至少有2-4倍的線程塊數量,因爲你有SMs,並且通常有更多的線程塊比這更少的傷害。

但是,如果你啓動一個只有1個線程塊的內核,那麼你只能被限制爲1個SM。因此,您獲得的機器性能約爲1/(number of SMs in your GPU)。該線程塊中的線程數不會影響此因素。