Действительно ли несколько возможно войти в список, массив, что-то в устройстве функционирует с размером списка/массива, являющегося параметром в вызове … или глобальная переменная, это инициализируется во время вызова?
Я хотел бы что-то как один из них, перечисляют для работы:
unsigned int size1;
__device__ void function(int size2) {
int list1[size1];
int list2[size2];
}
Действительно ли возможно сделать что-то умное, чтобы заставить что-то вроде этого работать?
Есть 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];
// . . .
}
Вы должны принять во внимание: память выделен на весь блок.
Если вы знаете, какие значения размера вы можете ожидать, подумайте об использовании шаблонов C ++. Вместе с препроцессором ускорения вы можете легко сгенерировать несколько экземпляров / точек входа.
вы также можете динамически выделять разделяемую память и вручную назначать указатели. Очевидно, это может не сработать, если вам требуется частная память потока сверх общей памяти
. Я могу предоставить вам ссылку, если вы хотите увидеть пример