У меня есть функция ядра, которая использует разделяемую память следующим образом:
__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 , но я не уверен, как использовать его в моем случае?