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を必要とするシーンでは、非常に役に立ちます.