2016-10-11 103 views
-1

为了测试动态并行性,我编写了一个简单的代码,并使用以下命令将其编译到GTX1080上。CUDA Dynamic Parallelism Deferencing全局内存

nvcc -arch=sm_35 -dc dynamic_test.cu -o dynamic_test.o 
nvcc -arch=sm_35 dynamic_test.o -lcudadevrt -o dynamic_test 

但是,输出并不如预期。看起来像传递给子内核的指针被取消引用。

#include <stdlib.h> 
#include <stdio.h> 
#include <cublas_v2.h> 
#include <cuda_runtime_api.h> 

__global__ void child(int *a, int *b, int *c){ 

     int tid = threadIdx.x; 
     c[tid] = a[tid] + b[tid]; 
} 


__global__ void Parent(int *a, int *b, int *c){ 

     int tid = threadIdx.x; 
     const int n = 10; 

     a[tid] = tid; 
     b[tid] = 2*tid; 
     c[tid] = -10; 

     __syncthreads(); 
     cudaDeviceSynchronize(); 
     if (tid == 1){ 
      child<<<1,n>>>(a,b,c); 
      cudaDeviceSynchronize(); 
     } 
} 


int main(){ 

     int *d_a, *d_b, *d_c; 
     const int n = 10; 
     int a[n],b[n],c[n],i; 

     cudaMalloc((void**)&d_a,n*sizeof(int)); 
     cudaMalloc((void**)&d_b,n*sizeof(int)); 
     cudaMalloc((void**)&d_c,n*sizeof(int)); 

     Parent << < 1, n >>> (d_a,d_b,d_c); 
     cudaDeviceSynchronize(); 

     cudaMemcpy(a,d_a,n*sizeof(int),cudaMemcpyDeviceToHost); 
     cudaMemcpy(b,d_b,n*sizeof(int),cudaMemcpyDeviceToHost); 
     cudaMemcpy(c,d_c,n*sizeof(int),cudaMemcpyDeviceToHost); 

     for(i=0; i<n; i++){ 
      printf("a[%d] = %d\n",i,a[i]); 
     } 
     for(i=0; i<n; i++){ 
      printf("b[%d] = %d\n",i,b[i]); 
     } 
     for(i=0; i<n; i++){ 
      printf("c[%d] = %d\n",i,c[i]); 
     } 

     cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); 

     return 0; 
} 

下面是输出:

a[0] = 1 
a[1] = 0 
a[2] = 4208446 
a[3] = 0 
a[4] = 0 
a[5] = 0 
a[6] = 0 
a[7] = 0 
a[8] = 0 
a[9] = 0 
b[0] = 3 
b[1] = 0 
b[2] = 4204323 
b[3] = 0 
b[4] = 4205312 
b[5] = 0 
b[6] = 4732449 
b[7] = 0 
b[8] = 4205680 
b[9] = 0 
c[0] = 194906208 
c[1] = 32767 
c[2] = 4204143 
c[3] = 0 
c[4] = 4205616 
c[5] = 0 
c[6] = 4732608 
c[7] = 0 
c[8] = 4231155 
c[9] = 0 

从编程指南阅读,我应该能够传递给孩子的内核全局变量,不会造成任何deferencing。我不知道为什么输出不正确。我的最终目标是在内核中使用cublas库。任何有关这方面的建议也会有所帮助。

+0

这也是您的第一个CUDA计划吗?你知道你的CUDA安装工作正常吗?因为我编译并运行了你的代码,并且它按预期工作。如果使用cuda-memcheck来运行它,会发生什么? – talonmies

+0

谢谢你指点我那个方向。它现在正在与cuda 8.0合作。 – JYC

回答

-1

该问题已通过从cuda 7.5切换到cuda 8.0来解决。

+1

当我运行你的代码时,我使用了CUDA 7.5,所以版本不是问题。 – talonmies

+0

我在集群上运行此代码,因为我无法访问这些图形卡,否则。可能是7.5的安装不正确。但是,我甚至不确定是不是这种情况,因为没有动态并行性的其他cuda程序编译并运行正常。 – JYC