pycuda cuda.mem_alloc申请到的地址一样的问题

在做pycuda的时候发现这样一个问题,

看下面代码

import pycuda.autoinit
import pycuda.driver as cuda
for i in range(10):
    d_A = cuda.mem_alloc(100)
    ########
    ### do something with d_A
    ########
    print (int(d_A))

int(d_A)表示在cuda上申请的gpu显存地址

期待的结果应该是每次申请到的显存地址都是不一样.

但是实际输出结果确是类似如下的输出:

140443048214528
140443048215040
140443048214528
140443048215040
140443048214528
140443048215040
140443048214528
140443048215040
140443048214528
140443048215040
 

!!!发现第三次申请的和第一次申请的一样,第四次申请的和第二次的一样!

这是个神奇的现象,而且是必现的.所以我在次做个尝试

import pycuda.autoinit
import pycuda.driver as cuda

d_A = cuda.mem_alloc(100)
print (int(d_A))
d_A = cuda.mem_alloc(100)
print (int(d_A))
d_A = cuda.mem_alloc(100)
print (int(d_A))
d_A = cuda.mem_alloc(100)
print (int(d_A))
d_A = cuda.mem_alloc(100)
print (int(d_A))

输出:

140579262431232
140579262431744
140579262431232
140579262431744
140579262431232

!!! 果然,结果也是一样的.

但是如果我改个名字:

import pycuda.autoinit
import pycuda.driver as cuda

d_A1 = cuda.mem_alloc(100)
print (int(d_A1))
d_A2 = cuda.mem_alloc(100)
print (int(d_A2))
d_A3 = cuda.mem_alloc(100)
print (int(d_A3))
d_A4 = cuda.mem_alloc(100)
print (int(d_A4))
d_A5 = cuda.mem_alloc(100)
print (int(d_A5))

输出:

140460871909376
140460871909888
140460871910400
140460871910912
140460871911424
 

所以这个问题实际上是由于pycuda对象的生命周期导致的。python的所有变量都是一个对象,如果该变量被重新赋值了,则原先对象就会被回收(垃圾回收机制)。回到上面的问题,在变量d_A被重新赋值后,原先d_A指向的对象就被释放了。

d_A = cuda.mem_alloc(100)        #1
print (int(d_A))    
d_A = cuda.mem_alloc(100)        #运行到这里的时候 1位置申请的cuda显存就被释放了。
print (int(d_A))
d_A1 = cuda.mem_alloc(100)        #1
print (int(d_A1))   
d_A2 = cuda.mem_alloc(100)        #运行到这里的时候,1处的显存空间不会被释放
print (int(d_A2))

因此如果要多次申请cuda的显存,请用不同的变量名来保存申请到的地址,否则一旦变量被释放的时候对应的cuda空间也会被释放。

你可能感兴趣的:(深度学习,cuda编程,pycuda)