考虑以下简单内核 -
#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) 提前感谢。
答案 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