2014年7月27日日曜日

Geforce TITAN でCUDA6.0を動かす

前回はCUDA5.0でのテストだったので、CUDA6.0ではどんなものかテストしてみた。
使用ソフトとはCUDA6.0のサンプルファイル「bandwidthTest」をVS2012でビルド。

■環境
CPU:3930k
GPU:Geforce TITAN
OS:Windows7 64bit

■前回データ(CUDA5.0)
 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     5815.1

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     6282.0

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     220126.1


■今回実施結果(CUDA6.0)n=3
 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     5924.5
   33554432                     6016.3
   33554432                     6015.6

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     6361.2
   33554432                     6399.1
   33554432                     6408.2

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     224998.1
   33554432                     224667.3
   33554432                     208915.6

若干高速化されてる?
割合にして3%ほど速くなったみたいだ。
ただ、PCIe Gen.2での話なのでGen.3だとどう変わるのか気になるところです。

CUDA 6.0インストール(Windows7 64bit)

CUDA 6.0が公開されていたのでインストールしてみる。
ついでに、Visual Studio 2012でサンプルファイルが動くところまで試してみた。

■環境
・CPU: Intel i7 3930k
・GPU:Geforce TITAN
・OS:Windows7 64bit
・Visual Studio Professional 2012(Ver.11.0)

■事前準備
下記リンクからCUDAのインストーラーをダウンロードしておく
※OSのビット数に合ったものでなければインストールできません


■インストール手順
(1). ダウンロードしたインストーラーを起動










インストーラーの解凍先を聞かれるが、デフォルトでOK


(2).インストーラーが立ち上がると「同意して続行する」をクリック





















(3).オプションもデフォルトの「高速」でOK





















(4).インストールが完了すると下記の画面になる
 「次へ」をクリックしてインストールは完了






















■インストール完了
はい、これでインストール完了です
前回と比べてえらく簡単に終わってしまいました

後は「C:\ProgramData\NVIDIA Corporation\CUDA Samples」
にサンプルファイルがあるので、インストールされているVisualStudioのバージョンに合うものであれば開くことが可能です。

■余談
ちなみに、私の環境で一度、インストールした後にサンプルファイルをビルドすると「MSB3721」のエラーが発生し、ビルドできませんでした。
前バージョンのように設定ファイルを変えてやる必要があるのかと思い、色々調べましたが有力な手掛かりは得られず、結局アンインストールした後に、再度インストールを行うと正常にサンプルファイルをビルドすることができました。

その前に一度再起動していたので、もしかしたらその時に変更した内容が反映されたのかもしれませんが、今となっては確かめる術も気力もないのでこのまま無かったことにしようと思います。

2014年3月16日日曜日

【VisualStudio2012】C++でフォームアプリ

C++でWindowsフォームアプリケーションを作ったことがなかったので調べてみた。

要約すると、
1.空のCLRプロジェクトを作成
2.ソリューションエクスプローラーから右クリック->追加->UI->Windowsフォーム
3.フォーム追加時にくっついてきた.cppファイルに下記コードを追加


// MyForm.cpp
#include "MyForm.h"//フォーム名

using namespace CPP;//プロジェクト名「CPP」

[STAThreadAttribute]
int main(){
 Application::EnableVisualStyles();
 Application::Run(gcnew MyForm());
}

【コマンドプロンプトを消す】
1.プロパティ->リンカ->システム->サブシステムにWindows (/SUBSYSTEM:WINDOWS)と入力
2.詳細設定のエントリポイントにmainと入力し、OK

2014年3月9日日曜日

C#でOpenCVを動かす

C++で実装するのに難儀していたこともあり、どうにかC#で実装できないか調べていたところ、OpenCvSharpなるものを発見。

どうやら、NuGetからインストールするだけでC#からOpenCVを動かせるそうな・・・

なにこれすごい


詳細については下記リンク先にて紹介されているので割愛します。




早速二値化してみた。

【元画像】


【二値化】



【AdaptiveThreshold MeanC】


















CPU:i7 3930k@1200MHz
上記スペックで1600x1200の適応的二値化を行うと20ms付近とかなり短い処理時間となった。
ただし、GaussianCではブロックサイズを大きくするにつれて、処理時間も伸びていった為、高速ラインで使用するらなMeanCの方が適切かなーと。

他にもblob関数もあったり色々実装されてるのでOpenCV+C#の入門に丁度いい気がする。
とはいえ、さすがにすべての関数を網羅しているわけではないので、そこは注意してほしい。

GPGPUも実装してみたいなぁ・・・

2013年6月16日日曜日

Visual C++ 2012でフォームデザイナーを使う

以前の記事でVC++2012ではフォームデザイナーが使えないとドヤ顔で申しましたが、間違いでした。
普通に使えます。

http://y-okamoto-psy1949.la.coocan.jp/booksetc/introvcpp/vs2012FormApp/

ひょっとしてMFCでも使えるのかと期待したがそんなことはなかった。
なんなんだMFC

2013年6月12日水曜日

VisualStudio2012でOpenCV2.4.5を動かす


■ダウンロード
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/

(1) 2.4.5をクリック
(2) OpenCV-2.4.5.exeをクリックするとダウンロードが始まる(266MB)
(3)ダウンロード中にC:に「OpenCV2.4.5」フォルダを作成

■インストール
(1)OpenCV-2.4.5.exeをクリックし起動
(2)「...」を選択し、C:\OpenCV2.4.5フォルダを選択
(3)Extractをクリック
(4)C:\OpenCV2.4.5\opencvへインストールされる


■環境変数設定
(1)スタート→コンピュータ(右クリック)→プロパティ→設定の変更→詳細設定→環境変数
PATHへ
  C:\OpenCV2.4.5\opencv\build\x86\vc11
  C:\OpenCV2.4.5\opencv\build\x86\vc11\bin
  の二つを追加(VC11 = VisualStudio2012)

■コンパイルテスト
(1)Visual Studio2012を起動し、Win32プロジェクトで新規作成

















(2)stdafx.hに以下のコードを追加
#include <opencv2/opencv.hpp>
#include "OpenCVheader.h"
(3)プロジェクトのプロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトリ
(4)C:\OpenCV2.4.5\opencv\build\includeを追加
(5)プロジェクトのプロパティ→構成プロパティ→VC++ディレクトリ→ライブラリディレクトリ
(6)C:\development\OpenCV2.4.2\opencv\build\x86\vc11\lib
(7)構成プロパティ→全般→共通言語ランタイムサポートを(/clr)へ変更
  (ここを忘れるとアンマネージ関数をコンパイル出来ませんと怒られる)
(8)ヘッダーファイル上で右クリックし、ヘッダーファイル(OpenCVheader.h)を新規作成。





















(9)OpenCVheader.hへ以下のコードを挿入

// バージョン取得
#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

// ビルドモード
#ifdef _DEBUG
#define CV_EXT_STR "d.lib"
#else
#define CV_EXT_STR ".lib"
#endif

// ライブラリのリンク(不要な物はコメントアウト)
#pragma comment(lib, "opencv_core"            CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_highgui"        CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_imgproc"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_calib3d"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_gpu"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_video"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_objdetect"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_features2d" CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_flann"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ffmpeg"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ts"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_contrib"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ml"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_legacy"  CV_VERSION_STR CV_EXT_STR)

(10)ビルドでOK


ここまでしてアレなんですが、正直VisualStudio2010で組んだ方が楽だと思われます。
VC++2012にはフォームデザイナーが存在しない為、レイアウトの作成が非常に手間ですので。

2013年6月11日火曜日

GeForce TITANでCUDAを動かす

GeForce TITANでCUDAを動かしてみた。

Bandwidth Test

 Device 0: GeForce GTX TITAN
 Quick Mode

 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     5815.1

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     6282.0

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     220126.1


実行性能でメモリバンド幅が約220GB/s・・・
速い・・・。

ちなみにDevice to Hostでは 6.3GB/sとえらく遅くなってるが、これはPCIe2.0x16の限界だろう。
PCIe3.0x16で単純計算で12GB/s付近までは伸びてくると思う。


うーむ、この暴力スペックで面白いアルゴリズムを動かしてみたいなぁ。