r1 =fun1c(nBlk)不能运行
    func1的调用在global修饰的函数中,即会在GPU中运行,而不能调用在CPU里常见的函数
    又因为func1不加任何的修饰符,默认就是host 函数,这些函数只为主机端编译,即在CPU中运行,
    所以r1 =fun1c(nBlk)不能运行
    r2=fun2c(nBlk)不能运行
    func2的调用在device修饰的函数中,即会在GPU中调用和运行,不能再CPU中调用
    而r2的调用者在main函数中,即在CPU中,所以不能运行
    cudaDeviceSynchronize() :
    原本该执行的CPU程序被放到了后面,因为该函数停止CPU端线程的执行,直到GPU端完成之前。

    1. #include<stdio.h>
    2. int func1(int x){
    3. return 2*x;
    4. }
    5. __device__ int func2(int x){
    6. return 2*x;
    7. }
    8. __host__ __device__ int func3(int x){
    9. return 2*x;
    10. }
    11. void __global__ cube_gpu1(){
    12. int tid = threadIdx.x;
    13. int r1;
    14. //r1 = func1(tid);
    15. //r1 = func2(tid);
    16. r1 = func3(tid);
    17. printf("tid:%d, cube:%d\n", tid, r1);
    18. }
    19. __global__ void cube_gpu2(){
    20. int tid = threadIdx.x;
    21. int r1;
    22. r1= func3(tid);
    23. printf("tid:%d, cube:%d\n", tid, r1);
    24. }
    25. int main()
    26. {
    27. printf("Host and device functions!\n");
    28. printf("\nResults from device:\n");
    29. int nBlk = 3;
    30. int nGrid = 2;
    31. cube_gpu1<<<nGrid, nBlk>>>();
    32. cube_gpu2<<<nGrid, nBlk>>>();
    33. cudaDeviceSynchronize();
    34. int r2;
    35. r2 = func1(nBlk);
    36. //r2 = func2(nBlk);
    37. r2 = func3(nBlk);
    38. printf("\nResults from host:%d\n", r2);
    39. r2 = func3(nGrid);
    40. printf("\nResults from host:%d\n", r2);
    41. cudaDeviceReset();
    42. return 0;
    43. }