cuda的kernal调用kernal
cuda可以用kernal调用kernal
但是必须在计算能力sm35以上
#include <cuda_runtime.h> #include <device_launch_parameters.h> #include <stdio.h> #include <stdlib.h> // 定义一个 4*4 的矩阵来做 加法和减法 #define WIDTH 4 // 定义 子内核 // 子内核 对 矩阵中的数加 1 __global__ void Child_Kernel ( int * Matrix ) { int i = threadIdx.x ; if( i < WIDTH * WIDTH ) { Matrix[i] += 1 ; printf("matrix[i]=%d ",Matrix[i]); } } // 定义 父内核 __global__ void ParentKernel ( int * Matrix ) { Child_Kernel <<< 1 , 16 >>>( Matrix ) ; } int main (void) { size_t size = WIDTH * WIDTH * sizeof(int) ; int * dev_Matrix ; cudaMalloc( (void**)&dev_Matrix , size ) ; cudaMemset( dev_Matrix , 0 , size ) ; int *host_Matrix = (int *)malloc(size); cudaMemcpy(host_Matrix,dev_Matrix,size,cudaMemcpyDeviceToHost); for( int i=0 ; i< WIDTH * WIDTH ; i++ ) { printf( "%d " , host_Matrix[i] ) ; if( ( (i+1)%4 ) == 0 ) { printf("\n") ; } } ParentKernel <<< 1 , 16 >>> (dev_Matrix) ; cudaMemcpy(host_Matrix,dev_Matrix,size,cudaMemcpyDeviceToHost); for( int i=0 ; i< WIDTH * WIDTH ; i++ ) { printf( "%d " , host_Matrix[i] ) ; if( ( (i+1)%4 ) == 0 ) { printf("\n") ; } } cudaFree( dev_Matrix ) ; }
运行的执行命令
nvcc -arch=sm_50 -rdc=true test_dynamic_paralellism.cu