В этом примере показано, как использовать kernelfun
прагма в функции и генерирует код CUDA®.
В одном файле запишите функцию точки входа scalars
это признает, что два вектора вводят x,y
из размера 1x4096
и один скалярный вход scale
. Функция имеет два for
- циклы различных длин итерации, один для векторного сложения и один для нахождения совокупной суммы. Поместите coder.gpu.kernelfun()
прагма в scalars
функция.
Используйте codegen
функция, чтобы сгенерировать MEX-функцию CUDA.
GPU Coder создает три ядра: scalars_kernel1
для инициализации sout1=0
, scalars_kernel2
для векторного сложения и scalars_kernel3
ядро сокращения за совокупную сумму.
scalars_kernel1<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(gpu_sout1);
cudaMemcpy(gpu_y, y, 32768U, cudaMemcpyHostToDevice);
cudaMemcpy(gpu_x, x, 32768U, cudaMemcpyHostToDevice);
scalars_kernel2<<<dim3(2U, 1U, 1U), dim3(512U, 1U, 1U)>>>(gpu_y, gpu_x, gpu_vout);
scalars_kernel3<<<dim3(8U, 1U, 1U), dim3(512U, 1U, 1U)>>>(scale, gpu_x, gpu_sout1);
cudaMemcpy(vout, gpu_vout, 32768U, cudaMemcpyDeviceToHost);
cudaMemcpy(sout1, gpu_sout1, 8U, cudaMemcpyDeviceToHost);
scalars_kernel2
имеет два блока с 512 потоками на блок для в общей сложности 1 024 потоков, один для добавления каждого элемента. Точно так же scalars_kernel3
имеет восемь блоков с 512 потоками на блок, приводящий к в общей сложности 4 096 потокам. GPU Coder также выполняет оптимизацию, которая минимизирует количество cudamMemcpy
вызовы функции. В этом примере, копии входа x
находится в графическом процессоре, никаком дополнительном cudamMemcpy
требуется между scalars_kernel2
и scalars_kernel3
. В дополнение к оптимизации памяти любой последовательный код между ядрами сопоставлен с потоками CUDA, чтобы сохранить данные по графическому процессору.