我爲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);
這是因爲你正在運行一個塊。這隻會利用CUDA GPU的一小部分總容量。我沒有看到這個問題對任何人都會有多大好處,並且已經投票決定將其視爲過於本土化。 – talonmies
我正在同時運行一個塊(2.x計算能力設備中的1024個線程)中的所有線程。我需要1024個線程的更多塊?你可以解釋嗎?除非1024個線程不適合塊? –