スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CUDAで確保したメモリをthrustのdevice_vectorに変換して使うサンプル

特筆すべき点は何もないが、例によって自分が後で詳細を忘れてしまったときのためのサンプル。ベクトル aとbの各成分に対して、

(a[0] - b[0])^2 + (a[1] - b[1])^2 + ... (a[n-1] - b[n-1])^2

を計算する。(nはコマンドライン引数で指定、デフォルトは100)

thrustを用いる時の注意点(FAQに書いてあるが):
1. ファイルの拡張子は、見掛け上C++の構文で完結していても".cu"にする。
2. 同じく見掛け上C++の構文になっていても、コンパイルにはnvccを用いる。
3. doubleを使用するときは、-arch=sm_20 以上の指定で。

コンパイルに使用したコマンドライン:

nvcc -arch=sm_21 -I /usr/local/cuda/include -L /usr/local/cuda/lib64 testThrust.cu -lcuda -o testThrust

私の環境では、引数を1000000、10000000、100000000と増やすと、100000000 (10^8)でout of memoryとなった。


#include <thrust/device_vector.h>
#include <thrust/reduce.h>
#include <thrust/inner_product.h>
#include <thrust/functional.h>
#include <iostream>
#include <cstdlib>

struct subtractSquare
{
__host__ __device__
double operator()(const double &x, const double &y) const
{
return (x - y) * (x - y);
}
};

int main(int argc, char **argv)
{
double e;
int n;
if(argc > 0){
n = strtol(argv[1], NULL, 10);
}else{
n = 100;
}
double *a = new double[n];
double *b = new double[n];
for(int i = 0; i < n; i++){
a[i] = 1.1;
b[i] = 0.1;
}
double *dev_a;
double *dev_b;
cudaMalloc(&dev_a, sizeof(double) * n);
cudaMalloc(&dev_b, sizeof(double) * n);
cudaMemcpy(dev_a, a, sizeof(double) * n, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, sizeof(double) * n, cudaMemcpyHostToDevice);
thrust::device_ptr<double> ptr1 = thrust::device_pointer_cast(dev_a);
thrust::device_ptr<double> ptr2 = thrust::device_pointer_cast(dev_b);
thrust::device_vector<double> v1(ptr1, ptr1 + n);
thrust::device_vector<double> v2(ptr2, ptr2 + n);
thrust::plus<double> plus;
struct subtractSquare sq;
e = thrust::inner_product(v1.begin(), v1.end(), v2.begin(), 0.0, plus, sq);
std::cout << "e = " << e << "\n";
cudaFree(dev_a);
cudaFree(dev_b);
delete a, b;
return 0;
}

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。