CMakeでCUDAの-ccbinの正しい指定方法

半年ぶりの更新です.
半年の間に,しらすの春の旬と秋の旬をまたぐことになりました.
っていうか,寒いよ!夏がいいよ!!><

さて,Linux上のCMakeでCUDAを使っているんですが,CUDAではたいてい最新のGCCはサポートされません.
ということで,nvccの-ccbinオプションによってCUDA関連のコンパイルのみを古いGCCにすることができます.
普段のC++コードは最新のGCCで,CUDA関連のみはサポートされたGCCでご利用いただけます.

CMakeにおいてこれを行うときは少しクセがあり,だいぶ格闘したのでメモ.

-ccbinの例

例えば次のソースを用意します.

// prog.cu
int main()
{
}

GCCの4.8.1を使ってnvccでコンパイルしてみると.

$ g++ --version
g++ (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ nvcc prog.cu
In file included from /usr/local/cuda/bin/../include/cuda_runtime.h:59:0,
                 from <command-line>:0:
/usr/local/cuda/bin/../include/host_config.h:82:2: error: #error -- unsupported GNU version! gcc 4.7 and up are not supported!
 #error -- unsupported GNU version! gcc 4.7 and up are not supported!
  ^

$ nvcc prog.cu -ccbin g++-4.4
$ ./a.out
(うごいた)

こうなります.
ちなみに今回はCUDA 4.2の環境.

CUDAソースによる小さいサンプル

本題.

CMakeだとnvccは自動的に実行されるので,nvccに与えるオプションはちゃんと与える必要があります.

ということで,CMakeLists.txtの最小の例.
上のprog.cuと同じディレクトリに置きます.

#A tiny example of CMakeLists.txt

cmake_minimum_required(VERSION 2.8)                     # おまじない
project(osakanacuda)                                    # プロジェクト名

set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -ccbin g++-4.4)  # GCCへのパス.PATHが通っていればこのように名前のみの指定でもOK
#list(APPEND CUDA_NVCC_FLAGS -ccbin g++-4.4)            # これでもOK

#以下はどちらもダメ.違いがわかりますか?
#set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -ccbin=g++-4.4)
#list(APPEND CUDA_NVCC_FLAGS=-ccbin g++-4.4)

find_package(CUDA)                                      # CUDA環境を見つけてくれる.やらないとダメ
cuda_add_executable(prog prog.cu)                       # progっていう実行ファイルをビルドしてくれる設定になる

こんな配置だとすると,

.
├── CMakeLists.txt
├── prog.cu
└── build/

次のようにしてビルドします.

$ ls
CMakeLists.txt prog.cu build/

$ cd build
$ cmake ..
$ make

ダメって書いてある方の指定をすると,

nvcc fatal   : redefinition of argument 'compiler-bindir'
CMake Error at prog_generated_prog.cu.o.cmake:206 (message):
  Error generating
  /hogehogehogehogheohgoehgoehoge/build/CMakeFiles/prog.dir//./prog_generated_prog.cu.o

っていう内容を含んだエラーが出ます.

理由

正しい指定と誤った指定の違いは見ての通り,”-ccbin=hogehoge”か”-ccbin hogehoge”の違いなんですが,CMakeのFindCUDAにあるrun_nvcc.cmakeを読んでみると,
“-ccbin”という文節があった場合にその指定を優先するようになっており,
ない場合はCMakeの中でのデフォルトの指定をすることになっています.

なので,”-ccbin=hogehoge”をCUDA_NVCC_FLAGSに指定すると,nvccが呼び出されるときは

nvcc ... -ccbin=hogehoge -ccbin fugafuga ...

となり,「多重指定はダメだっちゃ」と怒られます.

なんちゅー仕様.誰か修正してくださ・・・

なお今回の環境は,

  • Debian 6.0
  • CMake version 2.8.11.1
  • CUDA 4.2
  • GCC 4.8.1/4.4.5

です.

root権限の無い哀れな子魚ちゃんたちのためのgcc野良インストール(Linux)

僕の専門は画像パターン認識でして,魚画像からの種類判別とかいつかやっていみたいなぁとか思ってるんですがなかなかこれは問題として難しそうです.ここ(PDF注意)とかにそういう文献が出てるんですがこれは何の本なんでしょう?知ってる方いたら教えて欲しいです.使われてる技術を見ると2000年代以降のものではないなという印象.それより昔のことは体系的には知りません・・・w

さて,常に最新のgccが使いたいという人のためのにgccを野良ビルドしてインストールする手順を以前さかな前線 » GCC 4.6.2が出たので手動インストール方法メモ(Linux)に書きました.

一方で,共用計算機などではroot権限がなく勝手にプログラムをインストールできないことがよくあります.
そんなときでも,自分の領域が割り当てられていればそこに野良ビルドしてインストールして使うことは可能です.
そういう構成を可能にするためのgccのビルド方法をメモっときました.
今回はGCC 4.7.2を64bit版Linuxに入れることを考えています.

基本的にはさかな前線 » GCC 4.6.2が出たので手動インストール方法メモ(Linux)と同じです.
ただし一部,gcc4.6.2の手動インストールメモ – N_Nao’s logを参考にしています.

Continue reading

Intel製CPU内蔵GPU使用時にLinuxホスト上のVMWareのゲストの3Dアクセラレーションが有効化できない場合の対処

先週金曜日(2013/1/25)から猛烈な寒波が全国を襲ったらしいのですが今日辺りからやっとゆるんで,名古屋の最低気温も0度越えでした.
もう晩冬になりますね.晩冬と言えば,綺麗なプロポーションで個人的に好きなお魚であるサヨリが旬ということでぜひ楽しんでみたいです.

さて,ホストをLinuxとしてVMWare上でWindowsゲストを動かす場合などで,GPUがIntel製である(HD Graphics 3000とかである)場合に,ゲストの3Dアクセラレーションが有効にできないようです.

Continue reading

MATEデスクトップ環境のマルチディスプレイ設定

お魚の目にはDHAって物質がたくさん含まれてて,その神経細胞に与える影響のおかげで,魚の目を食べると頭良くなるとかって言うんだそうですね.
IQの不足を実感する今日この頃であります.

さて,Linux Mintのデスクトップ環境の一つであるMATEですが,マルチディスプレイにしたときのデスクトップ周りの設定があまりなかったのでメモ.

基本的にはさかな前線 » Xfceのマルチディスプレイ設定をXfceからMATEにした話です.

表示する位置関係の設定

2枚のディスプレイの物理的配置と論理的配置を整合させる設定.
[メニュー]→[設定]→[モニタの設定]をクリック.

で,表示されてるディスプレイをD&Dして適切に配置しなおして,適用.
ま,この設定はググれば普通にでてきてくれますw

20130125_monitor_setting

パネルの表示位置

パネル(下のバー)はデフォルトでは「0番目のディスプレイ」に表示されます.
ディスプレイの配置によっては「0番目として認識されたディスプレイ」が適切な位置にないことも普通にあるので,パネルをどのディスプレイに表示するか設定します.

[メニュー]→[システムツール]→[設定エディタ]から設定エディタを開き,下のスクショのように[apps]→[panel]→[toplevels]→[panel0]へと辿ります.
そこにあるmonitorの項目が,何番目のディスプレイにパネルを表示するかの設定なので,0から1や2など適切な番号に変えることで,意図した配置になります.

20130125_setting_editor

壁紙をディスプレイに応じて変えることはできないのか(´・ω・`)

MATEデスクトップ環境では調べた限りできないみたいですね・・・

google-glogで最低限使いたい,ただ1つの機能 〜自動スタックトレース出力〜

もう10年以上も前になりますけども,近場の漁港によく連れて行ってもらって魚釣りしていました.
ちょうどアジは西日本の日本海側が本場ということもあって,僕の地元では岸壁に立ってサビキをすると小アジがたくさん釣れました.

さて,google-glogと言えばgoogle謹製のログライブラリ.
Google Japan Blog: C++ のプログラムのデバッグを楽にする方法にて概要が紹介されていて,ドキュメントには簡単なチュートリアルがあります.基本的には使い方に難しいところは何も無いです.

お魚さん的には学部卒論のときから使っててもはや手放せないんですが,作業が切羽詰ってくるとあんまり律儀にログを出す余裕がなくなってきますw
そんな時でもただ一ついつでも使ってたのが,「落ちた時にスタックトレースを吐く機能」です.
ということで今回はそれに絞って紹介.まとまった記事を書くには今時間的余裕がない><

Continue reading

ssh -Xでevinceが動かない場合の対処

ぶっちゃけるとわりと最近までそれほど魚食べるのは好きじゃなかったんですね.
でも魚キャラを2年かそこらくらいやってて,自分の中に変化が….
というわけでお魚食べたいです.お魚.

さて,sshのX転送は便利でよく使わしてもらってるんですが,アプリによっては特有のエラーで使えなかったり.

Ubuntu系ディストロにて標準で使えるevince(PDFのドキュメントビューア)もそんなアプリの一つで,ssh -Xで普通に実行すると次のようなエラーが出ます(ちゃんと環境変数設定してても).

% DISPLAY=localhost:10.0 evince hogehoge.pdf
(evince:xxxxx): EggSMClient-WARNING **: Failed to connect to the session manager: None of the authentication protocols specified are supported
                Cannot parse arguments: ディスプレイをオープンできません:

ぐぐると,日本語の情報はあんま見つかんなかったのですが,
My Meaningless Scribbles …: Evince would not start over SSH X-forwarding
で解決法が紹介されました.エラーメッセージだけでぐぐるとこれは見つからなかったですね.
これしてからsshで入った先で,

% sudo ln -s /etc/apparmor.d/usr.bin.evince /etc/apparmor.d/disable
% sudo /etc/init.d/apparmor restart

を実行すると,他のアプリと同様にX転送してくれるようになって(゚д゚)ウマーです.

おっと論文書いてることバレるぞ(違

sshプロキシ設定

あけましておめでとうございます.
蛇年ですね.年男ですが,今年も魚でやっていきます.

さて,ラボのLAN内の自分のマシンに学外からsshで入りたいです.
そのためには,ラボのゲートウェイを超える必要があって,多段SSHをする必要があります.

家PCから,ラボGWにsshして,そこからラボPCにssh,これを,SSHプロキシ機能で一度にやってくれる設定.
いわゆるport forwardingではなくて,ncとかも不要で原理もわかりやすく設定もラクです.

基本的にはこのあたりを参考にしてるというかそのままです.
The Weight @northeye: sshコマンドだけで多段ログインする
あとこのやり方の手がかり?は@ton1517が教えてくれました.thx!

家PC,ラボGW,ラボPCどれもLinuxです.

家PCの自分のssh設定を記述します.$HOME/.ssh/configを編集してください.

  • 家PCホスト名: HOMEPC
  • ラボGWホスト名: LABGW (外から普通にsshできる完全な名前で)
  • ラボPCホスト名: LABPC
  • ラボPCに入るときのユーザ名: labgw_name
  • ラボGWに入るときのユーザ名: labpc_name

として,

% cat ~/.ssh/config
Host LABPC
    Hostname        LABPC
    User            labpc_name
    ProxyCommand    ssh labgw_name@LABGW -W %h:%p

ホスト名はIPアドレスでもおkです.

何段階かのGWを経る必要がある場合はHostのホスト名やプロキシ先を変えながら経由するGWの分だけ線形リストのように書き足して行けるようです.

これで,家PCにて

HOMEPC% ssh LABPC

でラボPCに一気につながります.ユーザ名修飾も不要で(゚д゚)ウマーです.
また,

HOMEPC% ssh -XY LABPC

としてXの転送もできて超(゚д゚)ウマーです.

以上,2013年最初の記事は完全に自分用メモでした.

私事ですが,こうしてラボ外からでも自由に研究できるようにしないとヤバい状況です.なんという年明け.
研究という名のエクストリームスポーツ.

cv::Matとcv::Mat_<T>の画素アクセスの速度

近くのスーパーに秋は国内産の鮭が売っててよく買ってたんですが最近は輸入のサーモンばっかしです少し寂しいです.

OpenCVでちょっと気になって,画素単位のアクセスをするときcv::Matのat()による方法とcv::Mat_のoperator()による方法でどっちが速いかなと思って調べてみました.
星の数ほどされてる議論のようなするけどぱっと見た範囲で見当たらなかったのでやってみた.
参考までに画像ピクセル値へのアクセスと計算速度 | OpenCV.jpもあります.

結論から言うと,全く同じでした.

コードはこんなかんじ.時間計測はオレオレライブラリで高精度な計測ができます.

実行結果はこんなかんじ.

% ./a.out
cv::Mat::at<T>() -> 9.82353ms/回
cv::Mat_<unsigned char>::operator() -> 9.69412ms/回

大きさ(w,h)によらず同じくらいの模様.

あと気になる生配列とのアクセス速度の差ですが,上述プログラムと同じ処理を書いちゃうと最適化で全部消えちゃうしそうならないくらい複雑なプログラムは面倒だったので断念.
最適化しなければ,cv::Matの方が3割くらい遅いくらいでした.最適化するとどうなるやら.

  • CPU: i7 870 (2.93GHz)
  • OS: Ubuntu 11.10 x86
  • gcc: 4.7.0
  • option: -std=c++0x
  • OpenCV: 2.4.3

追記:
Ivy Bridge速すぎワロタw

  • CPU: i5 3570 (3.40 GHz)
  • OS: Linux Mint 13
  • gcc: 4.6.3
  • OpenCV: 2.4.3
% ./a.out
cv::Mat::at<T>() -> 2.34902ms/回
cv::Mat_<unsigned char>::operator() -> 2.34902ms/回

Linuxでの野良ビルドのOpenCVでカメラをちゃんと使うにはlibv4l-devが必要みたい

地元に鮎の美味しいお店があって,そこの背ごしは最高の絶品だったりします.また行きたいですが,地元でも山の中なので,行くこと自体がけっこう大変.

さて,Computer Vision Advent Calendarの担当日からすでに3時間遅刻していますがこれはその記事ではありません.
今,がんばって書いてるところです(←

手元のLinux環境でOpenCVを野良ビルドするとき,libv4l-devをインストールしてからでないと,cv::VideoCaptureが動かないみたいです.

$ sudo apt-get install libv4l-dev
 ...
 --   Video I/O:
 --     DC1394 1.x:                  NO
 --     DC1394 2.x:                  YES (ver 2.2.0)
 --     FFMPEG:                      YES
 --       codec:                     YES (ver 53.35.0)
 --       format:                    YES (ver 53.21.0)
 --       util:                      YES (ver 51.22.1)
 --       swscale:                   YES (ver 2.1.0)
 --       gentoo-style:              YES
 --     GStreamer:                   NO
 --     OpenNI:                      NO
 --     OpenNI PrimeSensor Modules:  NO
 --     PvAPI:                       NO
 --     GigEVisionSDK:               NO
 --     UniCap:                      NO
 --     UniCap ucil:                 NO
 --     V4L/V4L2:                    Using libv4l (ver 0.8.6)
 --     XIMEA:                       NO
 --     Xine:                        NO
 ...

ここでUsing libv4lとなってることが重要みたいです.

cv::VideoCaptureが無言でエラーだけ返すので困りましたがそういうことだったみたいです.

Xfceのマルチディスプレイ設定

もうそろそろかれこれ1年近くXfce派です.
最近はLinux Mint 13のXfce版を使ってます.

さて,マルチディスプレイをするときですが,標準の設定ツール(「ディスプレイ」ダイアログ)は全く使い物になりません.並べて表示すらできない.
ですが,「設定エディタ」ダイアログを使うと自由自在に設定できるので,メモ.

Continue reading