ノート
訪問者 7506  最終更新 2013-08-20 (火) 16:28:36

旧バージョン ノート/CUDA/CUDA設定onFedora12

Titanを入手したので、Fedora19上にCUDA5.5をインストールする(2013-07-08)

OSインストール

Centos6.4はまだマザーボードのチップセットに対応していなかったので、Fedora 19にする。

CUDA 5.5 インストール (2013-07-08)

一般ユーザが、自分のホームディレクトリの下へCUDA5.5開発環境をインストールするには

システムレベルのインストールだと、/usr/local/cuda-5.5の下に開発環境(samples)を展開し、一般ユーザにとってはread-onlyになってしまう。

一般ユーザが開発できるためには、コマンド

cuda-install-samples-5.5.sh ./      (但し「./」はインストールしたい場所)

を実行する。そうすると

Copying samples to .//NVIDIA_CUDA-5.5_Samples now...
Finished copying samples.

で、今いる下「./」に NVIDIA_CUDA-5.5_Samples というディレクトリを作って、その中にサンプルファイルが(書き込み可能で)コピーされる。 ここを使って、プログラムを作ればよい。

Samples がコンパイルできるようになった

以下の話は、/usr/local/cuda-5.5においた(システム用の)開発ディレクトリ上で実験している。一般ユーザは、自分のディレクトリの下に展開したNVIDIA_CUDA-5.5_Samplesの下であると読み替えてほしい。

2013-07-08_TitanSpec.png
(www.hardwarecanucks.com)

gpupiを実行してみる(2013-07-09)

CUDAの変更点

あとはほとんどそのままで動いた。変更後のプログラムは

#include <stdio.h>
//include <cutil.h>  Disappeared

// CUDA runtime
#include <cuda_runtime.h>

// helper functions and utilities to work with CUDA
#include <helper_functions.h>
#include <helper_cuda.h>

//#define FLOAT float
#define FLOAT double

#define BLOCK 2048    /* Number of blocks */
#define THREAD 32  /* Number of threads per block */

#define STRIPS 65536*256  /* Number of total strips */
//#define STRIPS 65536  /* Number of total strips */

void Host(FLOAT *Result);
__global__ void Kernel(FLOAT *Result);

FLOAT h_result[THREAD*BLOCK];

int main(int argc, char** argv){
        StopWatchInterface *timer = 0;
        sdkCreateTimer(&timer);
        //unsigned int timer;
        FLOAT pi;

        //CUT_DEVICE_INIT(argc, argv);
        int devID = findCudaDevice(argc, (const char **)argv);

        FLOAT *d_result;

        cudaMalloc((void**) &d_result, sizeof(FLOAT)*THREAD*BLOCK);
        cudaMemset(d_result, 0, sizeof(FLOAT)*THREAD*BLOCK);

        sdkStartTimer(&timer);

        cudaMemcpy(d_result, h_result, sizeof(FLOAT)*THREAD*BLOCK, cudaMemcpyHostToDevice);

        fprintf(stderr, "THREAD=%d, BLOCK=%d\n", THREAD, BLOCK);
        dim3 grid(BLOCK, 1, 1);
        dim3 threads(THREAD, 1, 1);
        Kernel<<< grid, threads >>>(d_result);

        cudaMemcpy(h_result, d_result, sizeof(FLOAT)*THREAD*BLOCK, cudaMemcpyDeviceToHost);

        sdkStopTimer(&timer);
        printf("計算時間 =%f(ms)\n", sdkGetTimerValue(&timer));
        sdkDeleteTimer(&timer);

        pi=0.0;
        for (int k=0; k<THREAD*BLOCK; k++) {
                pi += h_result[k];
                //printf("Result[%d]=%15.12f\n", k, h_result[k]);
        }
        printf("GPU計算結果 =%15.12f\n",  (pi - (((FLOAT)0.5)/((FLOAT)STRIPS))) * (FLOAT)4.0);

        cudaFree(d_result);

        sdkCreateTimer(&timer);
        sdkStartTimer(&timer);
        Host(h_result);
        sdkStopTimer(&timer);
        printf("ホストの計算時間 =%f(ms)\n", sdkGetTimerValue(&timer));
        sdkDeleteTimer(&timer);

        pi=0.0;
        for (int k=0; k<THREAD*BLOCK; k++) {
                pi += h_result[k];
                //printf("Result[%d]=%15.12f\n", k, h_result[k]);
        }
        printf("host計算結果 =%15.12f\n",  (pi - (((FLOAT)0.5)/((FLOAT)STRIPS))) * (FLOAT)4.0);
        //getch();
}

__global__ void Kernel(FLOAT *Result)
{
        //GPUでの処理
        int ix=blockIdx.x*blockDim.x + threadIdx.x;
        FLOAT tmp=0.0;

        for(int k=0; k<(STRIPS/BLOCK/THREAD); k++){
                FLOAT x = ((FLOAT) ((ix*(STRIPS/BLOCK/THREAD))+k)) / ((FLOAT)STRIPS);
                tmp+=((FLOAT)sqrt(1.0-x*x)) / ((FLOAT)STRIPS);
        }

        Result[ix]=tmp;
}

void Host(FLOAT *Result){
        //ホスト側での計算
        int k, ix;
        FLOAT x, tmp;
        for(ix=0; ix<(THREAD*BLOCK); ix++){
                tmp = 0.0;
                for(k=0; k<(STRIPS/BLOCK/THREAD); k++){
                        x = ( (((FLOAT)ix)*((FLOAT)(STRIPS/BLOCK/THREAD))) + (FLOAT)k) / ((FLOAT)STRIPS);
                        tmp=tmp+(((FLOAT)sqrt(1-(x*x))) / ((FLOAT)STRIPS) );
                        //printf("xi=%15.12f\n", ((FLOAT)sqrt(1.0-x*x)) / ((FLOAT)STRIPS));
                }

                Result[ix]=tmp;

        }
}

実行結果は

GPU Device 0: "GeForce GTX TITAN" with compute capability 3.5

THREAD=32, BLOCK=2048
計算時間 =3.423000(ms)
GPU計算結果 = 3.141592653573
ホストの計算時間 =359.904999(ms)
host計算結果 = 3.141592653573

となった。

NVIDIAのプロファイラ

titanでは/usr/local/cuda/bin/の下に、プロファイラが2つ入っている。


添付ファイル: file2013-07-08_TitanSpec.png 703件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-20 (火) 16:28:36 (1459d)