CUDA, как загружать и выгружать двухмерный массив из памяти GPU
Код:
template<class float_double> void createMatrix(float_double ***Matrixp,unsigned int matrixSize)
{
*Matrixp = new float_double*[matrixSize];
float_double **c= *Matrixp;
for (int i=0; i<matrixSize; i++) //цикл по всем указателям
{
c[i]=new float_double[matrixSize]; //выделить память на строку i
}
}
void someFunc()
{
float **A;
createMatrix( &A,MatSize);
float_double *aDev = 0;
size_t apitch=0;
cudaMallocPitch((void **)&aDev, &apitch, MatSize*sizeof(float_double), MatSize );
// как быть дальше?
}
{
*Matrixp = new float_double*[matrixSize];
float_double **c= *Matrixp;
for (int i=0; i<matrixSize; i++) //цикл по всем указателям
{
c[i]=new float_double[matrixSize]; //выделить память на строку i
}
}
void someFunc()
{
float **A;
createMatrix( &A,MatSize);
float_double *aDev = 0;
size_t apitch=0;
cudaMallocPitch((void **)&aDev, &apitch, MatSize*sizeof(float_double), MatSize );
// как быть дальше?
}
cudaMemcpy, а указатель передать как параметр в ядерную функцию
Так в двухммерном же массив указателей + указатель на указаель, который указывает на этот массив.
Насколько мне известно, память под обычные многомерные массивы может выделяться на устройстве только линейно cudaMalloc (cudaMallocPitch). Поэтому к многомерным массивам идет обращение только через одномерный высчитываемый индекс.
Во всяком случае я не нашел другой альтернативы и делал имеено так.
Вот исчерпывающее руководство по работе с память gpu
CUDA 4.2 memory management