nvidiaパラレルコンピューティングライブラリthrustテスト
7231 ワード
nvidia thrustライブラリの概要:
前期準備
Thrust is a C++ parallel programming library which resembles the C++ Standard Library.
githubアドレス:https://github.com/thrust/thrustc++パラレルライブラリは、cuda環境でデフォルトでインストールされています.実際の業務で役に立つのはsortとreduce(sum)ですが、これを見ると疑問に思うかもしれませんが、多くのライブラリでsortとsumの操作が可能ですが、なぜthrustを使うのでしょうか.いくつかの高性能のアプリケーションでは、cpuの計算能力が満たされていないため、gpu/fpga/npuなどの異機種計算カードを使用して、cpuの短板を補完する必要があります.thrustはnvidiaが提供し、cudaを用いてsortおよびsum操作を実現するライブラリである.前期準備
nvidiaのグラフィックカードが必要で、もしIDCの機械室のサーバーならば、teslaのグラフィックカードに行くかもしれなくて、少し高いO(∩∩)Oハッ!Cuda環境のインストール
プログラミングの変化
主なプログラミング習慣はcudaプログラミングと一致し,hostはcpuを表し,deviceはgpuを表す.メモリ内のデータはhostデータとdeviceデータに分けられ、両者のデータ交換には明示的なレプリケーションが必要です.
sortパフォーマンスの検証
公式サイトのsort例を検証します#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(void)
{
// generate 32M random numbers serially
thrust::host_vector<int> h_vec(32 << 20);
std::generate(h_vec.begin(), h_vec.end(), rand);
clock_t startTime,endTime;
startTime = clock();//
// transfer data to the device
thrust::device_vector<int> d_vec = h_vec;
// sort data on the device (846M keys per second on GeForce GTX 480)
thrust::sort(d_vec.begin(), d_vec.end());
// transfer data back to host
thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
endTime = clock();//
cout << "The run time second is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
コンパイル運転$ nvcc sort.cu -o sort
$ ./sort
The run time second is: 0.419299s
32 Mのデータ、3200万本のデータ、400 msで完成し、cpuで実現するのは難しい.リアルタイム性の要求が非常に高いsortを必要とするシーンでは、非常に役に立ちます.
主なプログラミング習慣はcudaプログラミングと一致し,hostはcpuを表し,deviceはgpuを表す.メモリ内のデータはhostデータとdeviceデータに分けられ、両者のデータ交換には明示的なレプリケーションが必要です.
sortパフォーマンスの検証
公式サイトのsort例を検証します#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(void)
{
// generate 32M random numbers serially
thrust::host_vector<int> h_vec(32 << 20);
std::generate(h_vec.begin(), h_vec.end(), rand);
clock_t startTime,endTime;
startTime = clock();//
// transfer data to the device
thrust::device_vector<int> d_vec = h_vec;
// sort data on the device (846M keys per second on GeForce GTX 480)
thrust::sort(d_vec.begin(), d_vec.end());
// transfer data back to host
thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
endTime = clock();//
cout << "The run time second is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
コンパイル運転$ nvcc sort.cu -o sort
$ ./sort
The run time second is: 0.419299s
32 Mのデータ、3200万本のデータ、400 msで完成し、cpuで実現するのは難しい.リアルタイム性の要求が非常に高いsortを必要とするシーンでは、非常に役に立ちます.
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(void)
{
// generate 32M random numbers serially
thrust::host_vector<int> h_vec(32 << 20);
std::generate(h_vec.begin(), h_vec.end(), rand);
clock_t startTime,endTime;
startTime = clock();//
// transfer data to the device
thrust::device_vector<int> d_vec = h_vec;
// sort data on the device (846M keys per second on GeForce GTX 480)
thrust::sort(d_vec.begin(), d_vec.end());
// transfer data back to host
thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
endTime = clock();//
cout << "The run time second is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
$ nvcc sort.cu -o sort
$ ./sort
The run time second is: 0.419299s