スポンサーサイト

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

コンソールモードでCUDAプログラムを実行する場合の設定

これもCUDA Toolkit Release Notes に書いてある割には毎回必要になったときに忘れているのでメモ。

/etc/rc.local あたりで


/sbin/modprobe nvidia

if [ "$?" -eq 0 ]; then

# Count the number of NVIDIA controllers found.
N3D=`/sbin/lspci | grep -i NVIDIA | grep "3D controller" | wc -l`
NVGA=`/sbin/lspci | grep -i NVIDIA | grep "VGA compatible controller" | wc -l`

N=`expr $N3D + $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i;
done

mknod -m 666 /dev/nvidiactl c 195 255

else
exit 1
fi

あるいは単純に

mknod -m 666 /dev/nvidia0 195 0 (ビデオカードが一枚の場合)
mknod -m 666 /dev/nvidicactl 195 255

としておく。通常はXでログインするときに同等の操作が自動的に行われるので上記は必要ないが、一枚しかビデオカードがない環境でcuda-gdbを使うためにXサーバを起動せずにCUDAを使う、といった状況でこの設定が必要となる。
スポンサーサイト

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。