CUDA: использование глобальных переменных для памяти устройства - PullRequest
1 голос
/ 05 января 2012

У меня есть вопрос относительно того, как использовать правильные переменные в коде cuda.В моей программе много массивов, к которым нужно обращаться в разных функциях, и я хочу избежать их передачи и хочу использовать глобальные переменные и двумерные массивы mallocpitch вместо плоского одномерного массива.Итак, я думаю о чем-то вроде этого:

__device__ double * dataPtr ;
__device__ size_t dataPitch;
....
int main()
{
 double * dataPtrLoc; size_t dataPitchLoc;
cudaMallocPitch( (void**) &dataPtrLoc, &dataPitchLoc, width*sizeof(double), height);
cudaMemcpyToSymbol(dataPtr, &dataPtrLoc, sizeof(dataPtrLoc));
cudaMemcpyToSymbol(dataPitch, &dataPitchLoc, sizeof(dataPitchLoc));
...
}

Похоже ли это на хороший способ получить глобальные данные 2D устройства?Можете ли вы дать предложения?

Редактировать: я сделал эту программу, и она компилируется и работает нормально:

#include <stdio.h>
__device__ int *d_gridPtr;
__device__ size_t d_gridPitch;

__device__ int valij(int ii, int jj)
{
  int* row = (int*)((char*)d_gridPtr + ii * d_gridPitch);
  return (row[jj]);
}

__global__ void printval()
{
  int val0, val1, val2, val3;
  val0= valij(0,0);
  val1= valij(0,1);
  val2= valij(1,0);
  val3= valij(1,1);
  printf("%d %d %d %d \n", val0, val1, val2, val3);
}

int main()
{
  size_t d_gridPitchLoc;
  int * d_gridPtrLoc;  
  cudaMallocPitch((void**)&d_gridPtrLoc, &d_gridPitchLoc, 2 * sizeof(int), 2);
  cudaMemcpyToSymbol(d_gridPtr, & d_gridPtrLoc, sizeof(d_gridPtrLoc));
  cudaMemcpyToSymbol(d_gridPitch, &d_gridPitchLoc, sizeof(float));

  int h_mem[2*2]={0,1,100,4};  
  size_t hostpitch = 2* sizeof(int);
  cudaMemcpy2D(d_gridPtrLoc,d_gridPitchLoc,h_mem,hostpitch,2*sizeof(int),2,cudaMemcpyHostToDevice );

  printval<<<1,1>>> ();
  cudaDeviceReset();  
}

1 Ответ

1 голос
/ 27 февраля 2012

Если все потоки деформации или блока обращаются к одному и тому же адресу глобальной памяти только для чтения (например, индекс массива) одновременно, тогда рассмотрите возможность хранения этих глобальных данных только для чтения в массиве памяти __constant__. Если вы пишете данные, вы не можете использовать __constant__.

Если ваш массив доступен только для чтения, а шаблон доступа имеет сильную двумерную локальность (внутри деформации и / или блока), рассмотрите возможность использования текстур.

...