Проблемы со временем с clock_gettime() CUDA

Я хотел написать код CUDA, в котором я мог бы воочию увидеть преимущества CUDA для ускорения работы приложений.

Вот код CUDA, который я написал с помощью Thrust ( http://code.google.com/p/thrust/ )

Вкратце, все, что делает код, это создает два целочисленных вектора длиной 2^23, один на хосте и один на устройстве, идентичных друг другу, и сортирует их. Он также (пытается) измерить время для каждого.

В хост-векторе я использую std::sort. В векторе устройства я использую thrust::sort.

Для компиляции я использовал

nvcc sortcompare.cu -lrt

Вывод программы на терминал

Рабочий стол: ./a.out

Затраченное время хоста: 19 . 224622882 секунды

Устройство Затраченное время: 19 . 321644143 секунды

Рабочий стол:

Первый оператор std::cout создается через 19,224 секунды, как указано. Тем не менее, второй оператор std::cout (хотя в нем указано 19,32 секунды) создается сразу после первого оператора std::cout. Обратите внимание, что я использовал разные метки времени для измерений в clock_gettime(), а именно ts_host и ts_device.

Я использую Cuda 4.0 и вычислительную мощность NVIDIA GTX 570 2.0.

  #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<stdlib.h>

    //For timings
    #include<time.h>
    //Necessary thrust headers
    #include<thrust/sort.h>
    #include<thrust/host_vector.h>
    #include<thrust/device_vector.h>
    #include<thrust/copy.h>


    int main(int argc, char *argv[])
    {
      int N=23;
      thrust::host_vector<int>H(1<<N);//create a vector of 2^N elements on host
      thrust::device_vector<int>D(1<<N);//The same on the device.
      thrust::host_vector<int>dummy(1<<N);//Copy the D to dummy from GPU after sorting 

       //Set the host_vector elements. 
      for (int i = 0; i < H.size(); ++i)    {
          H[i]=rand();//Set the host vector element to pseudo-random number.
        }

      //Sort the host_vector. Measure time
      // Reset the clock
        timespec ts_host;
        ts_host.tv_sec = 0;
        ts_host.tv_nsec = 0;
        clock_settime(CLOCK_PROCESS_CPUTIME_ID, &ts_host);//Start clock

             thrust::sort(H.begin(),H.end());

        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_host);//Stop clock
        std::cout << "\nHost Time taken is: " << ts_host.tv_sec<<" . "<< ts_host.tv_nsec <<" seconds" << std::endl;


        D=H; //Set the device vector elements equal to the host_vector
      //Sort the device vector. Measure time.
        timespec ts_device;
        ts_device.tv_sec = 0;
            ts_device.tv_nsec = 0;
        clock_settime(CLOCK_PROCESS_CPUTIME_ID, &ts_device);//Start clock

             thrust::sort(D.begin(),D.end());
             thrust::copy(D.begin(),D.end(),dummy.begin());


        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_device);//Stop clock
        std::cout << "\nDevice Time taken is: " << ts_device.tv_sec<<" . "<< ts_device.tv_nsec <<" seconds" << std::endl;

      return 0;
    }

person smilingbuddha    schedule 11.11.2011    source источник
comment
Ваш вопрос не ясен. Вы сказали, что ваши два времени отличаются на 0,1 с, и что разница едва заметна человеческому глазу. В чем проблема?   -  person Oliver Charlesworth    schedule 11.11.2011
comment
Я сделал редактирование, чтобы сделать вопрос более ясным.   -  person smilingbuddha    schedule 11.11.2011
comment
О, я вижу. Хорошо, ваша проблема явно не имеет ничего общего с CUDA или Thrust, поэтому я предлагаю удалить эти теги и, возможно, упростить код вашего примера (просто используйте вызов sleep или что-то в этом роде).   -  person Oliver Charlesworth    schedule 11.11.2011
comment
Эммм... почему кто-то проголосовал за мой вопрос?   -  person smilingbuddha    schedule 11.11.2011


Ответы (1)


Вы не проверяете возвращаемое значение clock_settime. Я предполагаю, что он терпит неудачу, вероятно, с errno установленным в EPERM или EINVAL. Прочтите документацию и всегда проверяйте возвращаемые значения!

Если я прав, вы не сбрасываете часы, как вы думаете, поэтому второе время суммируется с первым, плюс некоторые дополнительные вещи, которые вы вообще не собираетесь учитывать.

Правильный способ сделать это — вызвать только clock_gettime, сначала сохранить результат, выполнить вычисления, а затем вычесть исходное время из конечного времени.

person John Zwinck    schedule 11.11.2011