我正在使用GlobalMemoryStatusEX来查找系统中的内存量.
有没有类似的方法来查找我的显卡上的内存量?
这是我的一段代码:
use kernel32
use ifwinty
implicit none
type(T_MEMORYSTATUSEX) :: status
integer(8) :: RetVal
status%dwLength = sizeof(status)
RetVal = GlobalMemoryStatusEX(status)
write(*,*) 'Memory Available =',status%ullAvailPhys
我在Windows 7 x64上使用Intel Visual Fortran 2010.
谢谢!
最佳答案 由于您使用CUDA标记标记了此问题,我将提供CUDA答案.鉴于您的环境,不确定它是否真的有意义.
我没有在IVF上测试过这个,但它适用于gfortran和PGI fortran(linux).您可以使用许多实现中提供的fortran iso_c_binding模块直接从fortran代码中的CUDA运行时API库中调用例程.其中一个例程是cudaMemGetInfo.
这是一个从gfortran(在linux上)调用它的完整工作示例:
$cat cuda_mem.f90
!=======================================================================================================================
!Interface to cuda C subroutines
!=======================================================================================================================
module cuda_rt
use iso_c_binding
interface
!
integer (c_int) function cudaMemGetInfo(fre, tot) bind(C, name="cudaMemGetInfo")
use iso_c_binding
implicit none
type(c_ptr),value :: fre
type(c_ptr),value :: tot
end function cudaMemGetInfo
!
end interface
end module cuda_rt
!=======================================================================================================================
program main
!=======================================================================================================================
use iso_c_binding
use cuda_rt
type(c_ptr) :: cpfre, cptot
integer*8, target :: freemem, totmem
integer*4 :: stat
freemem = 0
totmem = 0
cpfre = c_loc(freemem)
cptot = c_loc(totmem)
stat = cudaMemGetInfo(cpfre, cptot)
if (stat .ne. 0 ) then
write (*,*)
write (*, '(A, I2)') " CUDA error: ", stat
write (*,*)
stop
end if
write (*, '(A, I10)') " free: ", freemem
write (*, '(A, I10)') " total: ", totmem
write (*,*)
end program main
$gfortran -O3 cuda_mem.f90 -L/usr/local/cuda/lib64 -lcudart -o cuda_mem
$./cuda_mem
free: 2755256320
total: 2817982464
$
在Windows中,您需要有一个正确安装的CUDA环境(假设视觉工作室).然后,您需要在该安装中找到cudart.lib,并链接到该安装.我不是100%确定这会在IVF中成功链接,因为我不知道它是否会与VS库链接的方式类似地链接.