В следующем примере кода выделяется двухмерный массив значений с плавающей точкой шириной × высотой и показано, как циклически проходить элементы массива в коде устройства [1]
// host code
float* devPtr;
int pitch;
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height);
myKernel<<<100, 192>>>(devPtr, pitch);
// device code
__global__ void myKernel(float* devPtr, int pitch)
{
for (int r = 0; r < height; ++r) {
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
float element = row[c]; }
}
}
В следующем примере кода выделяется ширина× массив CUDA высоты одного 32-битного компонента с плавающей запятой [1]
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
cudaArray* cuArray;
cudaMallocArray(&cuArray, &channelDesc, width, height);
В следующем примере кода копируется двумерный массив в массив CUDA, выделенный в предыдущих примерах кода [1]:
cudaMemcpy2DToArray(cuArray, 0, 0, devPtr, pitch, width * sizeof(float), height,
cudaMemcpyDeviceToDevice);
Следующий пример кода копирует массив памяти somehost в память устройства [1]:
float data[256];
int size = sizeof(data);
float* devPtr;
cudaMalloc((void**)&devPtr, size);
cudaMemcpy(devPtr, data, size, cudaMemcpyHostToDevice);
Вы можете понять эти примеры и применять их в своих целях.
[1] NVIDIA CUDA Compute Unified Device Architecture