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