2016-10-11 3 views
-1

Чтобы проверить динамический параллелизм, я написал простой код и скомпилировал его на GTX1080 со следующими командами.CUDA Динамическая параллелизм Отсрочка глобальной памяти

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