Мулти-GPU за peer to peer

Имам известни затруднения при настройването на 2 графични процесора за peer to peer комуникация. Използвам Cuda 4.0 и програмирам с fortran. PGI компилатор

Написах програма, която потвърждава, че имам 4 графични процесора, налични на моя възел.

Реших да използвам два от тях, но имах следната грешка: 0: DEALLOCATE: невалиден указател на устройство.

subroutine  directTransfer()

        use cudafor
        implicit none

        integer, parameter :: N = 4*1024*1024
        real, pinned, allocatable :: a(:), b(:)
        real, device, allocatable :: a_d(:), b_d(:)


        !these hold free and total memory before and after
        !allocation, used to verify  allocation happening on proper devices

        integer (int_ptr_kind()),allocatable ::
     &   freeBefore(:), totalBefore(:),
     &   freeAfter(:), totalAfter(:)

        integer :: istat, nDevices, i, accessPeer, timingDev
        type(cudaDeviceProp)::prop
        type(cudaEvent)::startEvent,stopEvent
        real :: time

        !allocate host arrays
        allocate(a(N), b(N))
        allocate(freeBefore(0:nDevices -1),
     &      totalBefore(0:nDevices -1))
        allocate(freeAfter(0:nDevices -1),
     &      totalAfter(0:nDevices -1))
        write(*,*) 'Start!'
        !get devices ionfo (including total and free memory)
        !before allocation
        istat = cudaGetDeviceCount(nDevices)
        if(nDevices < 2) then
            write(*,*) 'Need at least two CUDA capable devices'
            stop
        end if

          write(*,"('Number of CUDA-capable devices: ',
     &       i0, /)"),nDevices

        do i = 0, nDevices - 1
            istat = cudaGetDeviceProperties(prop, i)
            istat = cudaSetDevice(i)
            istat = cudaMemGetInfo(freeBefore(i), totalBefore(i))
        end do

       !!!Here is the trouble zone!!!!
        istat = cudaSetDevice(0)
        allocate(a_d(N))
        istat = cudaSetDevice(1)
        allocate(b_d(N))


       deallocate(freeBefore, totalBefore,freeAfter,totalAfter)
       deallocate(a,b,a_d,b_d)
       end subroutine  directTransfer 

Със следното нямам грешка:

istat = cudaSetDevice(0)
allocate(a_d(N))
!istat = cudaSetDevice(1)
!allocate(b_d(N))

С това също няма грешка:

!istat = cudaSetDevice(0)
!allocate(a_d(N))
istat = cudaSetDevice(1)
allocate(b_d(N))

Но тази грешка при връщане

istat = cudaSetDevice(0)
allocate(a_d(N))
istat = cudaSetDevice(1)
allocate(b_d(N))

Така че изглежда не мога да настроя 2 GPU за стартиране на моята програма. Бихте ли ми помогнали да разбера защо не е възможно да задам 2 графични процесора и съвет за разрешаване на това?


person Adjeiinfo    schedule 09.03.2014    source източник
comment
Не съм потребител на cuda fortran, но мисля, че преди да освободите, първо трябва да зададете устройството, на което е разпределена съответната променлива.   -  person Vitality    schedule 09.03.2014
comment
По същество мисля, че не можете да освободите a_d и b_d с една и съща команда, но трябва да се появи cuda set устройство между тях.   -  person Vitality    schedule 09.03.2014


Отговори (1)


Благодаря ти JackOLantern!!

Това беше номерът. Промених кода както следва и той работи перфектно

!clean up      
deallocate(freeBefore, totalBefore,freeAfter,totalAfter)
istat = cudaSetDevice(0)
deallocate(a_d)
istat = cudaSetDevice(1)
deallocate(b_d)
deallocate(a,b)

Това беше моят проблемен отговор. Надяваме се, че ще помогне на другите.

person Adjeiinfo    schedule 09.03.2014