Нечто подобное должно работать (написано в браузере, не тестировалось):
__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 одним вызовом ядра.
Какое ядро? Предполагаете ли вы, что вы собираетесь создать эквивалент ядра 'processCalcNorm' или вы будете вызывать версию устройства' processCalcNorm' из другого ядра или что-то еще? –
Yup Я планирую создать эквивалент ядра processCalcNorm! Но как мне это назвать с переменными, которые я хочу? –
Я дал ответ, потому что чувствовал, что это не сложно. Однако, для справок в будущем, такие вопросы («напишите мой код CUDA для меня») не рекомендуется. SO [ожидает] (http://stackoverflow.com/help/on-topic): «2.Questions с запросом кода должны демонстрировать минимальное понимание проблемы, которая будет решена. Включите попытки решения, почему они не работают, и ожидаемые результаты ». В следующий раз я предлагаю вам сделать попытку самостоятельно и описать проблемы с ней. Вы узнаете это лучше, и это может устранить вопросы о ваших намерениях. –