爲了測試動態並行性,我編寫了一個簡單的代碼,並使用以下命令將其編譯到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庫。任何有關這方面的建議也會有所幫助。
這也是您的第一個CUDA計劃嗎?你知道你的CUDA安裝工作正常嗎?因爲我編譯並運行了你的代碼,並且它按預期工作。如果使用cuda-memcheck來運行它,會發生什麼? – talonmies
謝謝你指點我那個方向。它現在正在與cuda 8.0合作。 – JYC