brucefan1983 / CUDA-Programming

Sample codes for my CUDA programming book
GNU General Public License v3.0
1.57k stars 322 forks source link

静态全局内存变量如何释放? #8

Closed Xianqi-Zhang closed 3 years ago

Xianqi-Zhang commented 3 years ago

老师好, P59页“全局内存的生命周期不是由核函数决定的,而是由主机端决定的”,第10章代码,reduce2static.cu中,声明静态全局变量如下, device real static_y[GRID_SIZE]; 但该数组并未释放。请问静态全局内存变量的生命周期?采用cudaFree(static_y)释放时报错,请问该如何释放该变量呢?

brucefan1983 commented 3 years ago

你好,静态数组的内存不是动态分配的(编译时就确定,所以在本例中用来节省 cudaMalloc 的时间,因为 cudaMalloc 有很大的 overhead),所以不需要手动释放。超出它的生命周期后,会自动释放。应该可以说,static_y 变量的生命周期是从程序开始到程序结束,可见范围是同文件内在它定义之后的所有函数。

哲勇

Xianqi Zhang @.***> 于 2021年3月27日周六 10:27写道:

老师好, P59页“全局内存的生命周期不是由核函数决定的,而是由主机端决定的”,第10章代码,reduce2static.cu中,声明静态全局变量如下, device real static_y[GRID_SIZE]; 但该数组并未释放。请问静态全局内存变量的生命周期?采用cudaFree(static_y)释放时报错,请问该如何释放该变量呢?

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/brucefan1983/CUDA-Programming/issues/8, or unsubscribe https://github.com/notifications/unsubscribe-auth/AF546OPXU7A5YJJ7ELA2TMTTFWJFNANCNFSM4Z4VU4RA .

Xianqi-Zhang commented 3 years ago

所以,代码里面 的static_y的声明,是在reduce函数之前,而不是在main函数的前面,是为了限制static_y的可见范围。但是生命周期,仍然是程序开始到结束,相比在main函数之前声明static_y,仅是可见范围不同,生命周期没有差别。 请问,限制可见范围,有什么特别的好处吗?

brucefan1983 commented 3 years ago

我认为你的理解正确。我认为,C++编程中尽量限制一个变量的可见范围是好的做法。也就是说,要尽量晚地定义一个变量。或者说,在不得不定义一个变量时再定义。好处主要是防止意外地改变某些变量的值,同时也增加可读性、可理解性。一个东西,越局部就越容易掌控,作用范围越广,就越不容掌控。

Xianqi-Zhang commented 3 years ago

好的,谢谢老师解答