Использование динамического распределения общей памяти для двух разных векторов
В функции ядра я хочу два вектора общей памяти, как с длиной size
(фактически sizeof(float)*size
).
Так как невозможно выделить память непосредственно в функции ядра, если нужна переменная, мне пришлось ее динамически выделять, например:
myKernel<<<numBlocks, numThreads, 2*sizeof(float)*size>>> (...);
и внутри ядра:
extern __shared__ float row[];
extern __shared__ float results[];
Но это не работает.
Вместо этого я сделал только один вектор extern __shared__ float rowresults[]
, содержащий все данные, используя выделенную память 2*size
. Таким образом, вызовы row
все те же, а вызовы results
похожи на rowresults[size+previousIndex]
. И это действительно работает.
Это не большая проблема, потому что я все равно получаю ожидаемые результаты, но есть ли способ разделить мою динамически выделенную разделяемую память на две (или более) разные переменные? Просто для красоты.
Ответы
Ответ 1
В разделе C Programming guide на __shared__ приведены примеры, в которых вы выделяете несколько массивов из динамически распределенной общей памяти:
extern __shared__ float array[];
__device__ void func() // __device__ or __global__ function
{
short* array0 = (short*)array;
float* array1 = (float*)&array0[128];
int* array2 = (int*)&array1[64];
}
Поскольку вы просто получаете указатель на элемент и создаете новый массив, я считаю, что вы можете адаптировать его для использования динамических смещений вместо статических смещений, которые они имеют в примере. Они также отмечают, что выравнивание должно быть одинаковым, что не должно быть проблемой в вашем случае.