时钟问题与clock_gettime()CUDA有关

时间:2011-11-11 02:04:15

标签: c++ c time cuda thrust

我想编写一个CUDA代码,我可以直接看到CUDA为加速应用程序提供的好处。

这是我使用Thrust(http://code.google.com/p/thrust/

编写的CUDA代码

简而言之,代码所做的就是创建两个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()中使用了不同的time_stamps进行测量viz 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 个答案:

答案 0 :(得分:1)

您没有检查clock_settime的返回值。我猜它会失败,可能是errno设置为EPERM或EINVAL。阅读文档并始终检查您的返回值!

如果我是对的,你不会像你想象的那样重置时钟,因此第二个时间与第一个时间是累积的,加上一些你根本不打算计算的额外的东西。

这样做的正确方法是仅调用clock_gettime,先存储结果,进行计算,然后从结束时间中减去原始时间。