スポンサーサイト

上記の広告は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;
}

CUDA 5.0 正式リリース

表題の通り、CUDA 5.0が正式に公開された。しかしリリースノートによると、Ubuntuはまだ12.04は正式サポート対象外。まあ、それでも11.10でコンパイラバージョンは4.6.1までサポートされている。12.04のgccバージョンは、今現在パッケージアップグレードを行うと4.6.3であり、4.6.1とは僅かな差なのでほとんど実用上は問題なく使えるだろう。

私もさっそく5.0RC版から正式版にアップデートしたいが、今現在数日かけてカリカリ計算中なのでそれが終わってからにしよう。

Delicious Save this on Delicious

GTC Japan 2012 インプレッション

先日GTC Japan 2012に行ってきた。非常に大雑把にまとめるとか、今回のキーワードはKeplerアーキテクチャと仮想化ということのようだった。Keplerアーキテクチャには、これまた大雑把にまとめるとFermiから比べて3つの大きな変化があった。

コア数を大きく増やす代わりに、クロック数を下げた。これによって、1チップあたりの性能も向上したが、何より単位消費電力あたりの演算能力が大幅に向上した。これはシステムを構成する際のノード数を増やせることを意味している。会場では、ハードウェアベンダーからは一筺体あたり4つのTeslaカードを内蔵できるシステムがいくつか発表されていた。

チップにフレームバッファの内容を効率的にエンコード、ネットワークに送出できるハードウェアが内蔵された。これによって、レンダリングした画面をリアルタイムに別のマシンに表示でき、グラフィックスをひとつのサービスとしてサーバから提供できる。

メモリ管理ハードウェアが追加、変更されて、仮想化に対応できるようになった。これによって一つの物理GPUが複数の仮想マシンにCUDAの機能を提供できるようになった。

以上の3点によって、GPUクラウドやゲームグリッドといった概念が現実のものとなり始めている。今までゲームと仮想化は相性が良くなかったが、じきに家庭にはタブレット程度の表示端末だけで、コアなゲームロジックや負荷の高いグラフィックス処理はすべてクラウドで行われ、ネット経由で手元に表示される、というふうになっていくのかもしれない。

ところで会場の抽選で、当りが出てAsusのタブレットTF300Tをいただいた。かねてより欲しかったが買うのはガマン、のリストに入っていたので、非常にありがたかった。最初からキーボードが付属するタイプで、これで実際のコーディングのとき以外はデスクトップマシンを起動する必要もなくなるかもしれない。省エネにも貢献でき、言うことなしである。NVIDIAと福引きの神様に感謝したい。

CUDA Toolkit 5.0

現在、登録デベロッパーはCUDA Toolkit 5.0の early access版をダウンロードして試用することができる。リリースノートによれば、とりあえずLinux(Ubuntu 11.10)版では、gcc 4.6.2が正式サポートされるようだ。

Linux上で開発する身としては、今回のリリースでありがたいのはEclipseベースのNsightデバッガ・プロファイラが利用可能になることだろう。コマンドラインからもnvprofという新しいプロファイラが利用できるようなので、チューニングが楽になりそうだ。正直言ってcuda-gdbは正常に動作する環境を整えるのがかなり難しく、今までカーネルコードのデバッグやチューニングはなかなか大変だったのだが、これが改善されるのならありがたいことだ。

あと、複数のソースファイルを個別にオブジェクトにコンパイルして最後にリンクするという作業フローが使えるようになったのがありがたい。今まではモジュールfooのソースをfoo.cuとfoo.cppに分割しておくといったことが難しかったのだが、これで純粋なC++コードの部分とCUDA C/C++の文法を含む部分とにソースを分離して管理することが容易になった。
プロフィール

GM3D

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

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

この人とブロともになる

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