общая память в рекурсии Cuda - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть функция ядра, которая использует разделяемую память следующим образом:

__global__ void big_kernel(double * R, double * I, double * xR, double * xI, double *mag, double *XmagI, double *data, double N)
{
  int id = threadIdx.x + blockIdx.x * blockDim.x;
  // float real = 0, imag = 0;
  float imag = 0;
  int len = my_sizeof(data) / my_sizeof(data[0]); //(sizeof(data) / sizeof(*data));
  int n = N / 2;
  imag = len / 2;

 // shared memory 
 __shared__ double * even[n];
 __shared__ double * odd[n];

   small_kernel<<data, n>> (...);
}

Функция small_kernel использует переменные совместно используемой памяти, определенные выше even и odd и вызывает себя рекурсивно , следующим образом:

__global__ void small_kernel(double* data, double N){

  // threads
  int id = threadIdx.x + blockIdx.x * blockDim.x;

  int n = N / 2;

  // the shared memory variables even and odd
  if (id < n){
    if ((id%2) == 0)
      even[ei++] = data[id];
    else
      odd[oi++] = data[id];
  }

  // wait for threads to fill up even and odd
  __syncthreads();

  // recursive function - calling itself
  small_kernel<<>>(...);

}

Итак, я определил переменные общей памяти even и odd в ядре big_kernel, которое вызывает ядро ​​small_kernel, и это с другой стороны вызывает себя рекурсивно и использует переменные общей памяти even и odd. Как я могу это исправить в Cuda? Мне известно о Dynami c Shared Memory , но я не уверен, как использовать его в моем случае?

...