gpt4 book ai didi

c++ - clock_gettime() CUDA 的时间问题

转载 作者:行者123 更新时间:2023-11-28 08:14:31 28 4
gpt4 key购买 nike

我想编写一个 CUDA 代码,在那里我可以亲眼看到 CUDA 为加速应用程序提供的好处。

这是我使用 Thrust ( http://code.google.com/p/thrust/ ) 编写的 CUDA 代码

简而言之,代码所做的就是创建两个 2^23 长度的整数 vector ,一个在主机上,一个在设备上,它们彼此相同,并对它们进行排序。它还(尝试)测量每个时间。

在宿主 vector 上,我使用 std::sort。在设备 vector 上,我使用 thrust::sort

为了编译我使用了

nvcc sortcompare.cu -lrt

程序在终端的输出是

Desktop: ./a.out

Host Time taken is: 19 . 224622882 seconds

Device Time taken is: 19 . 321644143 seconds

Desktop:

第一个 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;
}

最佳答案

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

如果我是对的,那么您并没有像您认为的那样重置时钟,因此第二次计时与第一次计时相加,再加上一些您根本不打算计算的额外内容。

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

关于c++ - clock_gettime() CUDA 的时间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088852/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com