cudaMallocPitch函数的定义及其应用主要涉及到在CUDA环境中分配二维数组(矩阵)的内存。这个函数通过返回一个间距值来确保每一行的元素都是对齐的,从而提高访问效率和满足特定的对齐要求。
函数原型如下:
// cuda_rumtime_api.h
2 extern __host__ cudaError_t CUDARTAPI cudaMallocPitch(void **devPtr, size_t *pitch, size_t widthByte, size_t height);
3
4 extern __host__ cudaError_t CUDARTAPI cudaMemcpy2D(void *dst, size_t dpitch, const void *src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind);
传入存储器指针 **devPtr,偏移值的指针 *pitch,数组行字节数 widthByte,数组行数 height。函数返回后指针指向分配的内存(每行地址对齐到 AlignByte 字节,为 256B 或 512B),偏移值指针指向的值为该行实际字节数(= sizeof(datatype) * width + alignByte - 1) / alignByte)
具体来说,cudaMallocPitch函数会根据给定的宽度(width)和高度(height),以及元素类型(type),分配一块线性内存,并返回一个指向该内存的起始地址。这个起始地址将被设置为当前行的首个元素,而不是数组的第一个元素。这样做的目的是为了确保每一行的首个元素都能按照256或512字节的倍数进行对齐。
二维数组实际上也是连续的空间,但是进行了内存对齐。一行的有效宽度为Width,在内存中的实际宽度为Pitch。Width和Pitch的单位都是Byte 。
此外,这个函数还会返回一个间距值,该值代表了分配的内存宽度,以字节为单位。这意味着每一行的有效宽度是宽度乘以元素大小。这对于需要在二维数组中计算地址的情况非常有用,比如图像处理、科学计算等场景。
总结来说,cudaMallocPitch函数在CUDA编程中用于分配二维数组的内存,其主要作用是确保每一行的首个元素都能按照256或512字节的倍数进行对齐,从而提高访问效率并满足特定的对齐要求。这种方法特别适用于那些需要在硬件上执行大量并行计算任务的应用,如图像处理、科学计算等。