私はCUDAがアプリケーションを高速化するために提供した利点を直接見ることができるCUDAコードを書きたいと思っていました。ここclock_gettime()でタイミングが狂うCUDA
コードがないことすべては、2つの2^23の長さの整数ベクトル、ホスト上の一方と同一のデバイス上に作成され、Iは推力(http://code.google.com/p/thrust/)
簡単に使用して書かれているCUDAコードでありますお互いに分け合い、並べ替えます。また、それぞれの時間を測定しようとします。
宿主ベクター上では、私はstd::sort
を使用する。デバイスベクトル上で私はthrust::sort
を使います。コンパイルのために
は、私が使用
NVCC sortcompare.cu -lrt
端子のプログラムの出力は
デスクトップです:
./a.outホスト時間は19です。 224622882秒
撮影時間は19です。 321644143秒
デスクトップ:
述べたように最初のstd :: coutの文が19.224秒後に生成されます。しかし、最初の std :: coutステートメントの後には、すぐにの後に、2番目のstd :: coutステートメント(19.32秒といっても)が生成されます。私はあなたがclock_settime
の戻り値をチェックしていないクーダ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;
}
質問が不明です。あなたは、あなたの2つの時間が0.1秒違うと言いました。その違いは、人間の目にはほとんど気付かれません。問題は何ですか? –
質問を明確にするために編集しました。 – smilingbuddha
ありがとうございます。さて、あなたの問題は明らかにCUDAやThrustとは関係がないので、これらのタグを削除し、サンプルコードを単純化することをお勧めします。 –