Подтвердить что ты не робот

Использование динамического распределения общей памяти для двух разных векторов

В функции ядра я хочу два вектора общей памяти, как с длиной 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]. И это действительно работает.

Это не большая проблема, потому что я все равно получаю ожидаемые результаты, но есть ли способ разделить мою динамически выделенную разделяемую память на две (или более) разные переменные? Просто для красоты.

4b9b3361

Ответ 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];
}

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