2016-10-11 50 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