gettime()CUDA
我想写一个CUDA代码,我可以直接看到CUDA为加速应用程序所提供的好处。
以下是我使用Thrust编写的CUDA代码(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()中使用了不同的time_stamps来测量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
,首先存储结果,进行计算,然后从结束时间减去原始时间。
上一篇: gettime() CUDA