CUDA:Копирование памяти на GPU 1 происходит медленнее при использовании нескольких GPU

StackOverflow https://stackoverflow.com/questions/2560446

Вопрос

В моей компании установлено два GTX 295, так что всего на сервере 4 графических процессора, и у нас есть несколько серверов.У нас GPU 1, в частности, был медленным, по сравнению с GPU 0, 2 и 3, поэтому я написал небольшой тест скорости, чтобы помочь найти причину проблемы.

//#include <stdio.h>
//#include <stdlib.h>
//#include <cuda_runtime.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cutil.h>

__global__ void test_kernel(float *d_data) {
    int tid = blockDim.x*blockIdx.x + threadIdx.x;
    for (int i=0;i<10000;++i) {
        d_data[tid] = float(i*2.2);
        d_data[tid] += 3.3;
    }
}

int main(int argc, char* argv[])
{

    int deviceCount;                                                         
    cudaGetDeviceCount(&deviceCount);
    int device = 0; //SELECT GPU HERE
    cudaSetDevice(device);


    cudaEvent_t start, stop;
    unsigned int num_vals = 200000000;
    float *h_data = new float[num_vals];
    for (int i=0;i<num_vals;++i) {
        h_data[i] = float(i);
    }

    float *d_data = NULL;
    float malloc_timer;
    cudaEventCreate(&start);
    cudaEventCreate(&stop); cudaEventRecord( start, 0 );
    cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
    cudaMalloc((void**)&d_data, sizeof(float)*num_vals);
    cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &malloc_timer, start, stop );
    cudaEventDestroy( start );
    cudaEventDestroy( stop );


    float mem_timer;
    cudaEventCreate(&start);
    cudaEventCreate(&stop); cudaEventRecord( start, 0 );
    cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
    cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &mem_timer, start, stop );
    cudaEventDestroy( start );
    cudaEventDestroy( stop );

    float kernel_timer;
    cudaEventCreate(&start);
    cudaEventCreate(&stop); cudaEventRecord( start, 0 );
    test_kernel<<<1000,256>>>(d_data);
    cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &kernel_timer, start, stop );
    cudaEventDestroy( start );
    cudaEventDestroy( stop );

    printf("cudaMalloc took %f ms\n",malloc_timer);
    printf("Copy to the GPU took %f ms\n",mem_timer);
    printf("Test Kernel took %f ms\n",kernel_timer);

    cudaMemcpy(h_data,d_data, sizeof(float)*num_vals,cudaMemcpyDeviceToHost);

    delete[] h_data;
    return 0;
}

Результаты таковы

GPU0 cudaMalloc занял 0.908640 мс Копирование на графический процессор заняло 296.058777 мс Тестовое ядро заняло 326.721283 мс

GPU1 cudaMalloc занял 0,913568 мс Копирование на GPU заняло 663.182251 мс Тест ядра занял 326.710785 мс

GPU2 cudaMalloc занял 0,925600 мс Копирование на GPU заняло 296,915039 мс Тестовое ядро заняло 327,127930 мс

GPU3 cudaMalloc занял 0,920416 мс Копирование на GPU заняло 296,968384 мс Тестовое ядро заняло 327,038696 мс

Как вы можете видеть, cudaMemcpy для графического процессора в два раза больше времени для GPU1.Это согласовано между всеми нашими серверами, медленным всегда является GPU1.Есть какие-нибудь идеи, почему это может быть?Все серверы работают под управлением Windows XP.

Это было полезно?

Решение

Это была проблема с драйвером.Обновление до последней версии драйвера исправило это

Другие советы

Возможно, это проблема с вашей шиной pci, попробуйте поменять местами карты в разных слотах, чтобы убедиться, что проблема не устранена.Если это проблема, скопируйте все свои данные на gtx295 через более быстрый слот и с помощью sli top скопируйте их на другой графический процессор (медленная шина pci).

Если вы можете использовать для загрузки gddr более быстрой видеокарты, то вы можете выполнить синхронизацию устройств с гораздо большей пропускной способностью, что также может помочь устранить проблему.Кроме того, проверьте свою пропускную способность с помощью программы NVidia bandwidth testing, чтобы получить некоторые физические результаты и протестировать.

Удачи вам!

Вы работаете в двухпроцессорной системе?В текущих наборах микросхем Tylersburg есть ошибка, из-за которой пропускная способность пути x86 (0) к GPU (1) медленнее, чем прямой путь от x86 (0) к GPU (0).Intel должна выпустить новую версию, чтобы исправить эту ошибку.Попробуйте привязать свой тестовый процесс к определенному процессору с помощью набора задач и посмотрите, какие результаты вы получите.

с уважением Марк

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top