Сроки горе с clock_gettime () CUDA - PullRequest
0 голосов
/ 11 ноября 2011

Я хотел написать код 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;
    }

1 Ответ

1 голос
/ 11 ноября 2011

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

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

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

...