2014-01-13 4 views
0

Если я использую указатели на функции C, как:CUDA Указатели, Визитные Ядра

void processCalcNorm(float* a, float* b, float* c, float* d, float* e, float* f) 
    { 
      *a = *a + *b; 
      *c = *c + *d; 
      *e = *e + *f; 
    } 

for(id = 0; id < 1000; id++) 
    { 
      processCalcNorm(&xcord[id],&lvelox[id],&ycord[id],&lveloy[id],&zcord[id],&lveloz[id]); 
    } 

Как следует ядро ​​будет вызвана, когда она выполняется?

+1

Какое ядро? Предполагаете ли вы, что вы собираетесь создать эквивалент ядра 'processCalcNorm' или вы будете вызывать версию устройства' processCalcNorm' из другого ядра или что-то еще? –

+0

Yup Я планирую создать эквивалент ядра processCalcNorm! Но как мне это назвать с переменными, которые я хочу? –

+2

Я дал ответ, потому что чувствовал, что это не сложно. Однако, для справок в будущем, такие вопросы («напишите мой код CUDA для меня») не рекомендуется. SO [ожидает] (http://stackoverflow.com/help/on-topic): «2.Questions с запросом кода должны демонстрировать минимальное понимание проблемы, которая будет решена. Включите попытки решения, почему они не работают, и ожидаемые результаты ». В следующий раз я предлагаю вам сделать попытку самостоятельно и описать проблемы с ней. Вы узнаете это лучше, и это может устранить вопросы о ваших намерениях. –

ответ

1

Нечто подобное должно работать (написано в браузере, не тестировалось):

__global__ void processCalcNorm_kernel(float* a, float* b, float* c, float* d, float* e, float* f, int len) 
    { 
     int idx = threadIdx.x + blockDim.x*blockIdx.x; 
     if (idx < len){ 
      a[idx] = a[idx] + b[idx]; 
      c[idx] = c[idx] + d[idx]; 
      e[idx] = e[idx] + f[idx];} 
    } 

#define DATA_LEN 1000 
#define nTPB 256 
... 
processCalcNorm_kernel<<<(DATA_LEN+nTPB-1)/nTPB, nTPB>>>(d_xcord,d_lvelox,d_ycord,d_lveloy,d_zcord,d_lveloz,DATA_LEN); 

Где d_... переменные являются копией устройства из одноименного переменного хоста, соответственно, установленная с cudaMalloc и cudaMemcpy звонков, как это (с использованием xcord в качестве примера):

float *d_xcord; 
cudaMalloc((void **)&d_xcord, DATA_LEN*sizeof(float)); 
cudaMemcpy(d_xcord, xcord, DATA_LEN*sizeof(float), cudaMemcpyHostToDevice); 

(и создать аналогичную последовательность для других переменных)

Обратите внимание, что цикл for в вашем исходном C-коде больше не требуется, поскольку графический процессор эффективно обрабатывает каждую итерацию вашего цикла for-loop одним вызовом ядра.

+0

Спасибо! Ты спасатель! –

+0

Как напечатать [id], если я его не определяю? –

+0

Вы можете определить переменную 'id' и распечатать ее, как хотите. Ваш вопрос мне непонятен, так как ваш оригинальный вопрос не указывает на то, как вы хотите распечатать данные. Я предлагаю опубликовать новый вопрос SO, если у вас проблемы с печатью. –

Смежные вопросы