определите переменный размер на массиве в локальной памяти, с помощью CUDA

Действительно ли несколько возможно войти в список, массив, что-то в устройстве функционирует с размером списка/массива, являющегося параметром в вызове … или глобальная переменная, это инициализируется во время вызова?

Я хотел бы что-то как один из них, перечисляют для работы:

unsigned int size1;

__device__ void function(int size2) {

    int list1[size1];
    int list2[size2];
}

Действительно ли возможно сделать что-то умное, чтобы заставить что-то вроде этого работать?

6
задан Donal Fellows 10 July 2010 в 19:45
поделиться

2 ответа

Есть 1 способ выделить динамический объем разделяемой памяти - использовать третий параметр ядра запуска:

__global__ void kernel (int * arr) 
{
    extern __shared__ int buf []; // size is not stated
    // copy data to shared mem:
    buf[threadIdx.x] = arr[blockIdx.x * blockDim.x + threadIdx.x];
    // . . . 
}
// . . . 
// launch kernel, set size of shared mem in bytes (k elements in buf):
kernel<<<grid, threads, k * sizeof(int)>>> (arr);

Для многих массивов существует хитрость:

__device__ void function(int * a, int * b, int k) // k elements in first list
{
    extern __shared__ int list1 [];
    extern __shared__ int list2 []; // list2 points to the same point as list1 does

    list1 [threadIdx.x] = a[blockIdx.x * blockDim.x + threadIdx.x];
    list2 [k + threadIdx.x] = b[blockIdx.x * blockDim.x + threadIdx.x];
    // . . .
}

Вы должны принять во внимание: память выделен на весь блок.

4
ответ дан 17 December 2019 в 18:09
поделиться

Если вы знаете, какие значения размера вы можете ожидать, подумайте об использовании шаблонов C ++. Вместе с препроцессором ускорения вы можете легко сгенерировать несколько экземпляров / точек входа.

вы также можете динамически выделять разделяемую память и вручную назначать указатели. Очевидно, это может не сработать, если вам требуется частная память потока сверх общей памяти

. Я могу предоставить вам ссылку, если вы хотите увидеть пример

0
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: