C++ cudaMallocPitch完成的实际内存分配

C++ cudaMallocPitch完成的实际内存分配,c++,cuda,C++,Cuda,在调试cuda代码中的内存泄漏时,我正在运行一些测试,想知道除了我要求的之外,GPU上还分配了什么 以下是我正在运行的测试: __HOST__ __forceinline__ double memoryUsage() { size_t free_byte = 0; size_t total_byte = 1; cudaMemGetInfo(&free_byte, &total_byte); return free_byte; } ... doub

在调试cuda代码中的内存泄漏时,我正在运行一些测试,想知道除了我要求的之外,GPU上还分配了什么

以下是我正在运行的测试:

__HOST__ __forceinline__
double memoryUsage()
{
    size_t free_byte = 0;
    size_t total_byte = 1;
    cudaMemGetInfo(&free_byte, &total_byte);
    return free_byte;
}

...
double mem = memoryUsage();
cudaMallocPitch((float**)&device_ptr, &pitch, width * sizeof(T), height);
ASSERT(mem - memoryUsage() == pitch * height);
...
当然,这里的断言失败了。我稍微简化了代码,但请注意,我检查了
cudamallocitch
中的任何错误

有人对此有解释吗?GPU(malloc)上的内存管理系统是否可以使用此内存?还是我只是误解了什么

如果有帮助的话,下面是我为
400 x 400 x sizeof(uint16\u t)
数组的一些分配得到的一些值:

pitch= 1024; mem-memoryUsage()= 0; pitch*height= 409600
pitch= 1024; mem-memoryUsage()= 1.04858e+006; pitch*height= 501760
pitch= 1536; mem-memoryUsage()= 1.04858e+006; pitch*height= 838656

谢谢你的帮助。

我要回答我自己的问题


这个问题()的答案显然是发生了什么
1.04858e+006
是在我的例子中用于在GPU上分配内存的页面大小。

您也在比较错误的内容。在您的案例中分配的缓冲区大小不是
pitch*height
。它应该是
width*height*sizeof(T)+pitch
。谢谢您的评论!如果我没有被误解的话
pitch
是分配的宽度(以字节为单位)(即
width+offset
)。根据Cuda文档,通过
T*pElement=(T*)((char*)基地址+行*间距)+列访问元素。因此,我认为
pitch*height
是正确的公式。
pitch*height
应该给出以字节为单位的分配大小,忽略开销。@Rippalka对此表示抱歉。我把音高误认为是偏移量。我的错。这没什么错,Cuda中的对齐有时会令人困惑。不过我很感激你的意图!非常感谢。