タグ

ブックマーク / handasse.blogspot.com (2)

  • CUDA 4.0でマルチGPU化が限りなく簡単になっているという話

    以前、複数のGPUでマンデルブロ集合を並列計算というブログ記事を書いた。このときはTeslaが1枚で7.45秒、Teslaが2枚で4.26秒で計算できたと報告したが、マルチGPU化は多少面倒だったし、ある程度のオーバーヘッドが掛かっていた。 しかし、CUDA 4.0がリリースされてから状況が一変した。自由にcudaSetDeviceが呼び出せるようになり、またUVA (Unified Virtual Addressing)を利用することにより、それはそれは簡単にマルチGPU化や、ホスト・複数GPU間での一元的なメモリの参照を実現できることになった。 というわけで、CUDA 4.0を使ったマンデルブロ集合のプログラムを以下に示す。シングルGPUからマルチGPUへ変更した部分については赤字で示してある。ただし、簡便のために、GPUデバイスは2枚で決め打ちとし、マンデルブロ集合の幅は2の倍数のピ

  • C/C++でポインタによる多次元配列を連続したメモリ領域に作成する

    下記のようにC/C++の配列で多次元配列を作れば連続したメモリ領域となるが、動的に大きさを変えられないし、関数に渡したりするのも大変だ。 int a[N][M]; 一方、ポインタを使った下記の方法だと確保したメモリ領域が不連続となる。 int **a = new int*[N]; for (int i = 0; i < N; i++) a[i] = new int[M]; 動的にメモリ確保して連続したメモリ領域にしたい場合、以下のようにすれば良い。 int **a = new int*[N]; a[0] = new int[N * M]; for (int i = 1; i < N; i++) a[i] = a[0] + i * M; ここで、a[i][j] と (*a)[i*M+j] は同じ値を示す。 二次元配列、三次元配列を扱った実際のコード(C/C++)を最後に載せておく。 Cバージ

    yukichanko
    yukichanko 2010/03/01
    連続した領域の多重配列を確保する方法
  • 1