Я хотел написать код 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;
}
sleep
или что-то в этом роде). - person Oliver Charlesworth   schedule 11.11.2011