NVIDIA GPU对设备内存0x0有什么作用?

6
似乎CUDA一书中的示例(《CUDA by Example: An Introduction to General-Purpose GPU Programming》)在初始化指针时从未将其置空。
两个问题:
1. GPU是否使用0x0(或整数0)作为空指针?我们应该遵循C/C++指针惯例来处理设备指针(例如,在初始化时将其置空)吗?
2. 在cudaFree之前,我们需要检查指针是否为NULL吗? if (devPtr) HANDLE_ERROR(cudaFree(devPtr));
有人说对于Fermi架构,0x0用于片上共享内存,看起来我们仍然可以假设0x0不应被使用的指针所指向。 http://forums.thedailywtf.com/forums/p/25369/273567.aspx 那么Kepler架构呢?GPU如何处理0x0地址?
谢谢!

1
这个问题在http://forums.thedailywtf.com/forums/p/25369/273567.aspx上有一个很好的讨论。基本上,在Fermi上,NULL可能是一个有效的指针。 - rkapl
你是在询问主机API如何处理空指针,还是设备本身会怎么做?这两者之间有微妙但重要的区别。 - talonmies
我知道我们特别修复了cuMemAlloc(),以便它不会将NULL作为CUdeviceptr返回。听到自那时以来可能存在回归感到惊讶。 - ArchaeaSoftware
1个回答

1

通常情况下,您可以像处理主机指针一样处理NULL指针。回答您的问题:

  1. 是的。随意使用与主机相同的做法(随意置空)。

  2. 在释放之前检查是否为NULL是安全的,但不是必需的,因为cudaFree(0)实际上不会尝试释放任何内存。(事实上,cudaFree(0)通常用于初始化CUDA上下文!)我相信大多数现代malloc实现不会尝试释放值为零的指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接