memory cuda multi-gpu

memory - cudaMemGetInfo devuelve la misma cantidad de memoria libre en ambos dispositivos de GTX 690



multi-gpu (1)

Esto se solucionó cambiando la configuración del controlador WDDM de la siguiente manera:

Cambie "Desactivar modo multi-GPU" desde el panel de control de NVIDIA en "Configuración 3D" -> "Configurar Multi-GPU, Surround, PhysX".

[Esta respuesta se agregó de los comentarios como una entrada wiki de la comunidad para obtener la pregunta de la cola no respondida para la etiqueta CUDA]

He tenido problemas con Geforce GTX 690 al intentar rastrear el uso de la memoria. Un programa de prueba simple:

BOOST_AUTO_TEST_CASE(cudaMemoryTest) { size_t mem_tot_0 = 0; size_t mem_free_0 = 0; size_t mem_tot_1 = 0; size_t mem_free_1 = 0; unsigned int mem_size = 100*1000000; float* h_P = new float[mem_size]; for(size_t i = 0; i < mem_size; i++) { h_P[i] = 0.f; } cudaSetDevice(0); cudaDeviceReset(); cudaMemGetInfo (&mem_free_0, & mem_tot_0); std::cout<<"Free memory before copy dev 0: "<<mem_free_0<<std::endl; cudaSetDevice(1); cudaDeviceReset(); cudaMemGetInfo (&mem_free_1, &mem_tot_1); std::cout<<"Free memory before copy dev 1: "<<mem_free_1<<std::endl; cudaSetDevice(0); float* P; cudaMalloc((void**)&P, mem_size*sizeof(float)); cudaMemcpy((void*)P, h_P, mem_size*sizeof(float), cudaMemcpyHostToDevice); cudaSetDevice(0); cudaMemGetInfo(&mem_free_0, & mem_tot_0); std::cout<<"Free memory after copy dev 0: "<<mem_free_0<<std::endl; cudaSetDevice(1); cudaMemGetInfo(&mem_free_1, &mem_tot_1); std::cout<<"Free memory after copy dev 1: "<<mem_free_1<<std::endl; BOOST_CHECK(mem_free_0 != mem_free_1); cudaError_t err; err = cudaGetLastError(); if(err!=cudaSuccess) std::cout<<"an error occurred"<<std::endl; cudaSetDevice(0); destroyMem(P); delete [] h_P; }

La prueba se imprime:

1> Free memory before copy dev 0: 1733173248 1> Free memory before copy dev 1: 1688424448 1> Free memory after copy dev 0: 1289940992 1> Free memory after copy dev 1: 1289940992 CudaUtilsTest.cpp(47): error in "cudaMemoryTest": check mem_free_0 != mem_free_1 failed

El problema es que después de la asignación, la cantidad de memoria libre en el dispositivo 1 es exactamente la misma que en el dispositivo 0, lo que no debería ser el caso, por lo tanto, el problema tiene que estar en cudaMemGetInfo y / o cudaSetDevice. ¿Alguien corre el mismo problema o hay algo más fundamentalmente erróneo en la prueba que alguien pueda señalar?

Ejecución del código en Windows 7, Visual Studio 2010, Cuda SDK 5.0, compilación con generación de código: compute_30, sm_30

EDITAR 22.4.2013

Continué experimentando con este problema y parece que cudaSetDevice funciona bien, como se puede verificar a partir del resultado de las llamadas a cudaGetDevice. Agregué un reinicio del dispositivo 0 después de la prueba de asignación de memoria y parece que el tamaño de la memoria libre devuelta por cudaMemGetInfo es nuevamente el mismo para ambos dispositivos. He comprobado todos los valores devueltos de cuda_error_t en mi propio código y todas las llamadas a funciones devuelven cudaSuccess. ¿Alguien ha tenido problemas similares con la GTX 690 con la configuración descrita anteriormente?

Código de prueba más resentido:

BOOST_AUTO_TEST_CASE(cudaMemoryTest) { size_t mem_tot_0 = 0; size_t mem_free_0 = 0; size_t mem_tot_1 = 0; size_t mem_free_1 = 0; int device_num = 0; unsigned int mem_size = 100*1000000; float* h_P = new float[mem_size]; for(size_t i = 0; i < mem_size; i++) { h_P[i] = 0.f; } cudaSetDevice(0); cudaGetDevice(&device_num); cudaDeviceReset(); cudaMemGetInfo (&mem_free_0, & mem_tot_0); std::cout<<"Free memory before copy dev 0: "<<mem_free_0<<" Device: "<<device_num<<std::endl; cudaDeviceSynchronize(); cudaSetDevice(1); cudaGetDevice(&device_num); cudaDeviceReset(); cudaMemGetInfo (&mem_free_1, & mem_tot_1); std::cout<<"Free memory before copy dev 1: "<<mem_free_1<<" Device: "<<device_num<<std::endl; cudaDeviceSynchronize(); cudaSetDevice(0); cudaGetDevice(&device_num); float* P; cudaMalloc((void**)&P, mem_size*sizeof(float)); cudaMemcpy((void*)P, h_P, mem_size*sizeof(float), cudaMemcpyHostToDevice); cudaMemGetInfo(&mem_free_0, & mem_tot_0); std::cout<<"Free memory after copy dev 0: "<<mem_free_0<<" Device: "<<device_num<<std::endl; cudaDeviceSynchronize(); cudaSetDevice(1); cudaGetDevice(&device_num); cudaMemGetInfo(&mem_free_1, &mem_tot_1); std::cout<<"Free memory after copy dev 1: "<<mem_free_1<<" Device: "<<device_num<<std::endl; cudaDeviceSynchronize(); BOOST_CHECK(mem_free_0 != mem_free_1); cudaError_t err; err = cudaGetLastError(); if(err!=cudaSuccess) std::cout<<"an error occurred"<<std::endl; // Reset only device 0 and check both cudaSetDevice(0); cudaGetDevice(&device_num); cudaDeviceReset(); cudaMemGetInfo (&mem_free_0, & mem_tot_0); std::cout<<"Free memory after second reset of device 0, dev 0: "<<mem_free_0<<" Device: "<<device_num<<std::endl; cudaDeviceSynchronize(); cudaSetDevice(1); cudaGetDevice(&device_num); cudaMemGetInfo (&mem_free_1, & mem_tot_1); std::cout<<"Free memory after second device reset of device 0, dev 1: "<<mem_free_1<<" Device: "<<device_num<<std::endl; cudaDeviceSynchronize(); delete [] h_P; }

Prueba de salida:

1> Free memory before copy dev 0: 1794379776 Device: 0 1> Free memory before copy dev 1: 1751728128 Device: 1 1> Free memory after copy dev 0: 1351696384 Device: 0 1> Free memory after copy dev 1: 1351696384 Device: 1 1> CudaUtilsTest.cpp(353): error in "cudaMemoryTest": check mem_free_0 != mem_free_1 failed 1> Free memory after second reset of device 0, dev 0: 1751728128 Device: 0 1> Free memory after second device reset of device 0, dev 1: 1751728128 Device: 1