未从应用程序启动的简单CUDA内核

时间:2017-05-26 11:44:18

标签: cuda

考虑以下简单内核 -

 #include <stdio.h>
 #include <stdlib.h>
 #include <cuda.h>

 __global__ void dummyKernel(int *a)
 {
     int tid = threadIdx.x+blockIdx.x*blockDim.x;

     if(tid == 0) {
         a[0] = 10;
         a[1] = 6;
     }
 }

 int main() 
 {
     cudaStream_t stream;
     cudaStreamCreate(&stream);

     dim3 grid (2, 1, 1);
     dim3 block (8, 32, 1);

     printf("BEFORE CALL\n");
     int *a, *houtput;
     a = (int *)malloc(2*sizeof(int));
     houtput = (int *)calloc(2,sizeof(int));
     int *d_a;
     a[0] = 4;
     a[1] = 5;
     printf("Before Execution Value of array: %d %d\n",a[0], a[1]);
     cudaMalloc( (void**)&d_a, 2*sizeof(int) );
     cudaMemcpy( d_a, a, 2*sizeof(int), cudaMemcpyHostToDevice);
     dummyKernel <<< grid, block, 0, stream >>> (d_a);
     cudaMemcpy( a, d_a, 2*sizeof(int), cudaMemcpyDeviceToHost);
     printf("Value of array: %d %d\n",a[0], a[1]);

     cudaStreamDestroy(stream);

     printf("AFTER CALL\n");
     return 0;
 }

在一个独立的执行中(即,将它放在一个单独的.cu文件中并进行编译和运行),这个内核的行为应该是应该的,即在内核执行后打印“10 6”。但是,当我在我正在处理的应用程序中插入此内核时,它似乎没有启动(但没有编译时或运行时错误)。内核启动后打印的结果与内核启动前打印的结果相同,即“4 5”(与独立执行不同)。

指向何处开始寻找此问题的解决方案的任何指针(一个似乎是应用程序的Makefile)。 (我已经尝试销毁旧的CUDA上下文(以及所有旧的CUDA上下文),并创建一个新的。我也尝试在我的应用程序中的几个地方插入这个虚拟内核,目前我在CUDA的最早位置安顿下来内核可以放置)。作为附加信息,我正在处理的应用程序中有一些cuBlas内核,它们正在启动到GPU,但这个虚拟内核不是。 (我使用的是CentOS 6.6,CUDA 5.0) 提前感谢。

1 个答案:

答案 0 :(得分:-2)

我认为在你的代码中 Fri May 26 13:41:33 2017 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 375.26 Driver Version: 375.26 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla K80 On | 0000:04:00.0 Off | 0 | | N/A 45C P0 58W / 149W | 10871MiB / 11439MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla K80 On | 0000:05:00.0 Off | 0 | | N/A 37C P0 70W / 149W | 10873MiB / 11439MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla K80 On | 0000:84:00.0 Off | 0 | | N/A 32C P0 59W / 149W | 10871MiB / 11439MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla K80 On | 0000:85:00.0 Off | 0 | | N/A 58C P0 143W / 149W | 11000MiB / 11439MiB | 95% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 11757 C python 10867MiB | | 1 11757 C python 10869MiB | | 2 11757 C python 10867MiB | | 3 11757 C python 10996MiB | +-----------------------------------------------------------------------------+ 没用,你可以删除它。我建议你在内核计算之后应该stream

处理你庞大的应用程序时,你应该添加一个小的printf来显示你是否已经进行了内核计算步骤。或者你应该提供你的总应用程序(将它作为一个小模型)

synchronize