我已经在某些类的构造函数中为cudaMalloc()
分配了一些GPU全局内存。现在是时候破坏我构造的实例了,我有实例的数据指针。问题是,我担心其他地方的一些恶作剧代码可能会调用cudaDeviceReset()
,之后我的cudaFree()
可能会失败(我会收到invalid device pointer
错误)。那么,我怎么能判断我的指针是否符合cudaFree()
的条件?
答案 0 :(得分:2)
我不相信你可以做很多事情。
关于您可以做的最好的事情是尝试并设计对象的生命周期,这些对象将在其析构函数中调用CUDA API,以便在上下文破坏之前执行此操作。在实践中,这意味着在自动或手动拆除上下文之前,使它们以明确定义的方式落入范围。
对于像cudaFree()
之类的调用,无论如何都有点“火与忘”,最好的办法就是为调用编写自己的包装器并明确地捕获并高雅地忽略任何明显的错误条件。如果在上下文破坏之后进行调用,则会出现 -
答案 1 :(得分:1)
鉴于talonmies says,人们可能会考虑进行相反的讨论:
cudaDeviceReset()
来电还要考虑一个“生成计数器”。cudaMalloc()
以保持生成索引(您可能需要一个类/结构) - 在分配期间获得(也锁定)。 cudaFree()
包裹起来并且仅限cudaFree()。......虽然第二次认为这是一个很大的锁定。不确定它是否值得。我的意思是,不应该那么多cudaMalloc()正在进行,但仍然如此。哦,它可能是一个RW锁,因为分配和免费只是读者。