トップ | puarts.com
ロゴ
「CUDA」に関連する記事一覧
0  
CUDAでの計算機用にGeforce GTX 560 Tiを購入しました。価格はドスパラで19990円でした。
CUDAで使うということだけ考えれば値段の割に性能もそこそこでコストパフォーマンスが一番高いと思ってこれにしました。


今回購入したGeforce GTX 560 Tiはあくまで計算機用なので、ディスプレイ用は今まで通りQuadro FX 580を使います。つまり、グラボの2枚差しです。
ただでさえごちゃごちゃしていたPCケースの中身がさらに密度が上がって熱量が心配です。


PCを立ち上げてCUDA SDKの中にあるdeviceQuery.exeを実行してみるとちゃんと2枚のGPUがCUDA Deviceとして認識されていることがわかります。

[deviceQuery] starting...
deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)
Found 2 CUDA Capable device(s)

Device 0: "GeForce GTX 560 Ti"
  CUDA Driver Version / Runtime Version          4.0 / 4.0
  CUDA Capability Major/Minor version number:    2.1
  Total amount of global memory:                 962 MBytes (1008402432 bytes)
  ( 8) Multiprocessors x (48) CUDA Cores/MP:     384 CUDA Cores
  GPU Clock Speed:                               1.64 GHz
  Memory Clock rate:                             2004.00 Mhz
  Memory Bus Width:                              256-bit
  L2 Cache Size:                                 524288 bytes
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65535), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and execution:                 Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      No
  Device PCI Bus ID / PCI location ID:           4 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
Device 1: "Quadro FX 580"
  CUDA Driver Version / Runtime Version          4.0 / 4.0
  CUDA Capability Major/Minor version number:    1.1
  Total amount of global memory:                 461 MBytes (483000320 bytes)
  ( 4) Multiprocessors x ( 8) CUDA Cores/MP:     32 CUDA Cores
  GPU Clock Speed:                               1.13 GHz
  Memory Clock rate:                             800.00 Mhz
  Memory Bus Width:                              128-bit
  Max Texture Dimension Size (x,y,z)             1D=(8192), 2D=(65536,32768), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(8192) x 512, 2D=(8192,8192) x 512
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 8192
  Warp size:                                     32
  Maximum number of threads per block:           512
  Maximum sizes of each dimension of a block:    512 x 512 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 1
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Concurrent copy and execution:                 Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   No
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      No
  Device PCI Bus ID / PCI location ID:           3 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 4.0, CUDA Runtime Version = 4.0, NumDevs = 2, Device = GeForce GTX 560 Ti, Device = Quadro FX 580
[deviceQuery] test results...
PASSED

 


2枚のGPUの主な性能の比較表です。

  Quadro FX 580 Geforce GTX 560 Ti
CUDAプロセッサコア 32基 384基
メモリ 512  MB GDDR3 1024 MB GDDR5
メモリバンド幅(GB/sec) 25.6  128
メモリインターフェース幅 128-bit  256-bit
最大消費電力(W) 40 170

最大使用電力はQuadro FX 580が40WでGeforce GTX 560 Tiが170 Wなので合わせて210Wとなります。

もともと使っていたQuadro FX 580の消費電力が低かったおかげで大きいGPU一枚挿したのと同じくらいの消費電力で済みました。

CUDAでのデバイスの切り替えは次のようにcudaSetDevice(デバイス番号)を使えば行えるようです。

int dev=0;
CUDA_SAFE_CALL(cudaSetDevice(dev)); 
 


せっかくなのでさっそくCUDAで1000x1000の2次元拡散方程式を解かせてみました。
以下が結果です。




Quadro FX 580が26秒に対してGeforce GTX 560Tiが19秒。

しかもQuadro FX 580の方はディスプレイに表示する処理もしているのでそもそも不利な条件です。

消費電力がかなり増大した割にそんなに大して高速にはならないという結果で少し残念ですが、プログラムの書き方で処理時間もいろいろと変わってくると思うので、これからこの環境でCUDAの開発を行っていこうと思います。
C++自作ライブラリの画像処理系の関数をCUDAを使って高速化したいと思ったので、ひとまずベクトルの足し算を行う簡単なカーネル関数を使った関数をDLLでライブラリ化してみました。

方法は普通にDLLを作るのと何ら変わらないのですが、誰かの役に立つかもしれないのでCUDAで作ったシンプルな関数を簡易的にDLL化する手順を記しておきます。Windows用です。


1. まずはCUDAのサンプルコードなどのVC用のプロジェクトファイルをコピーして余計なファイルを取り除き、空のプロジェクトを作成

2. Visual StudioのメインメニュのProject > Propertiesからプロパティウィンドウを表示

3. Configulation Properties > GeneralのConfigulation TypeをDynamic Library(.dll)に変更
 

4. CUDAのカーネル関数とそれを使ってCPUとGPUをやりとりする関数を書く(下に例を載せてあります)

5. 関数の宣言部でエクスポートしたい関数の頭に__declspec(dllexport)をつける

void functionA();

だったら

__declspec(dllexport) void functionA();

のようにする。

6. ビルドするとdllとlibファイルが生成され完成

今回作成したベクトルの足し算を行うだけの関数のDLL用ソースコードの例を載せておきます。

cudaDllSample.h
#pragma once

__declspec(dllexport) void VectorAdd(float *o_vec, float *in_vecA, float *in_vecB, int length);
 


cudaDllSample.cu
#include <cutil_inline.h>
#include "cudaDllSample.h"

// Device code
__global__ void VecAdd(const float* A, const float* B, float* C, int N)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < N){
        C[i] = A[i] + B[i];
    }
}

void VectorAdd(float *o_vec, float *in_vecA, float *in_vecB, int length)
{
    float* d_A, *d_B, *d_C;
    size_t size = length * sizeof(float);

    // Allocate vectors in device memory
    cutilSafeCall(cudaMalloc((void**)&d_A,size));
    cutilSafeCall(cudaMalloc((void**)&d_B,size));
    cutilSafeCall(cudaMalloc((void**)&d_C,size));

    // Copy vectors from host memory to device memory
    cutilSafeCall(cudaMemcpy(d_A,in_vecA,size,cudaMemcpyHostToDevice));
    cutilSafeCall(cudaMemcpy(d_B,in_vecB,size,cudaMemcpyHostToDevice));

    // Invoke kernel
    int threadsPerBlock = 256;
    int blocksPerGrid = (length + threadsPerBlock - 1) / threadsPerBlock;
    VecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, length);
    cutilCheckMsg("kernel launch failure");

    // Copy result from device memory to host memory
    cutilSafeCall(cudaMemcpy(o_vec,d_C, size, cudaMemcpyDeviceToHost));
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);
    cutilDeviceReset();
}
 


以下は作成したDLLのテスト用のプログラムです。

test.cpp
#include <stdio.h>
#include <math.h>
#include "cudaDllSample.h"

#pragma comment(lib, "cudaDllSample.lib")

int main(){
    int length=10;
    int i;
    float *veca, *vecb, *vecc;

    veca=new float[length];
    vecb=new float[length];
    vecc=new float[length];

    //** init
    for(int i=0; i<10; i++){
        veca[i]=(float)i;
        vecb[i]=(float)10*i;
    }

    VectorAdd(vecc, veca, vecb, 10);

    //** Show result
    for (i = 0; i < length; ++i) {
        printf("%f + %f = %f\n", veca[i], vecb[i], vecc[i]);
    }

    delete[] veca;
    delete[] vecb;
    delete[] vecc;
    return 0;
}
 

Result
0.000000 + 0.000000 = 0.000000
1.000000 + 10.000000 = 11.000000
2.000000 + 20.000000 = 22.000000
3.000000 + 30.000000 = 33.000000
4.000000 + 40.000000 = 44.000000
5.000000 + 50.000000 = 55.000000
6.000000 + 60.000000 = 66.000000
7.000000 + 70.000000 = 77.000000
8.000000 + 80.000000 = 88.000000
9.000000 + 90.000000 = 99.000000 
0  

0.0374 sec
にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

Copyright(C)2006-2018 wsp All Rights Reserved