2015-02-20 6 views
0

Если я хочу сделать цикл for, в котором есть расчет на основе кода CUDA, и есть куча константы, которую я не хочу передавать между CPU и графическим процессором каждый время, когда код выполняется, есть ли что-нибудь, что я могу сделать?константа сохранения в CUDA на графическом процессоре

Например:

float* a, *b, *c; // a, b, and c changes each time for loop is executed 
int M, N;   // M and N get their value prior to the for loop, and 
        // they do not change during the for loop 

for (int n = 0; n < 100; n++) 
{ 
    CUDAComputation(a,b,c,M,N); 
} 

__global__ void CUDAComputation(double *a, 
           double *b, 
           double *c, 
           int M, 
           int N) 
{ 
    // cuda-based code 
} 

Я думаю, что может объявить глобальные переменные в .CU кода, который включает в свой файл заголовок, но затем M и N находятся в глобальной памяти, доступ которых к CUDA должен быть медленным ? Или я должен до cudamemcpy()M и N каждый раз к ядру? Благодарю.

ответ

2

M и N - это ints, отправляемые через параметры ядра. Я не буду беспокоиться о скорости этой транзакции, учитывая, что есть некоторые накладные расходы при вызове ядра, а дополнительные накладные расходы на отправку 2-х целых строк не будут значительными. Тем не менее, вы можете сделать следующее:

__device__ int d_M, d_N; 
int h_M, h_N; 

__global__ void CUDAComputation(){ 
//d_M and d_N are accessible in here 
} 

void runKernel(){ 
    h_M=25; h_N=24; 
    cudaMemcpyToSymbol(d_N, &h_M, sizeof(int)); 
    cudaMemcpyToSymbol(d_M, &h_M, sizeof(int)); 
    myKernel<<<128, 128>>>(); 
} 

Если вам нужно что-то большее, что является постоянным вы можете использовать что-то вроде:

__device__ float* devPointer; float* ptr; 
cudaMalloc(&ptr, 256 * sizeof(float)); 
cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr)); 
+0

OK. Благодарю. Просто интуитивно понятно, что нет необходимости многократно пересылать то, что не меняется каждый раз. – Ono

+0

Извините, код, который я включил, на самом деле не был тем, что я хотел поставить. Я обновил ответ. Если он выглядит хорошо сейчас, примите. –

+0

@Christian, каждый вызов 'cudaMemcpyToSymbol()' примерно такой же накладной, как и сам запуск ядра. – ArchaeaSoftware