2012年10月17日水曜日

ubuntu12.04にcuda5.0をインストールしたときに苦労した話

Ubuntu12.04でCUDAでハマったのでメモ。
※CUDAでGPGPU始める人はコレ読んでください。サンプルを見て練習できるので非常に理解がしやすいです。
とにかく、うまく行かなかった。
いろいろ試したが、何が効いたかはわからない。
…が、最終的にうまくいった。

自分の環境はUbuntu12.04 64bit、Dell Precision T5500, Quadro FX 580(capability 1.1)。

とりあえず、最初ココを見て、わけもわからずこのとおりにやった。
http://d.hatena.ne.jp/iRiE/20120620/1340230211
ここでやっている人と明らかに違うのが、Cudaのバージョンが5.0にアップグレードされているというところ。

Ubuntu12.04用のインストーラはないので、11.10のものを代わりに↓からダウンロードした。
http://developer.nvidia.com/cuda/cuda-downloads

sudo sh ./cuda_5.0.35_linux_64_ubuntu11.10.run
を実行すると、libglut.soがないと怒られた。

sudo apt-get install freeglut3-dev
した後、もう一度インストールしてみたが、
やはりないと言われる。

調べてみると、12.04 64bitではlibglut.soが変なところにインストールされることがわかった。

sudo ln -s /usr/lib/x86_64-linux-gnu/libglut.so /usr/lib/libglut.so
してちゃんとしたところにシンボリックリンクを貼る。

再度インストールするもInstall failed、失敗。
ログ見てみると、gdm止めねばならないことが判明。

 自分の場合、Shift+F1でtty1のコンソールを起動して、

sudo service lightdm stop
としてデスクトップマネージャーを止める。(12.04からgdmからlightdmに変わったらしい)

再度チャレンジすると、Installed、成功!

とりあえず、再起動。




デスクトップが起動しないではないか。
そのままtty1に飛ばされる。
ログを見てみると、plymouthに繋げなかったとか言っている。

よくわからないが、ウェブで調べた結果、xserver-xorg-nouveauを消してみたり、nvidia-currentをreinstallしてみたりした。

デスクトップが起動した。

しかし、compizが起動していない。なぜだ。

とりあえず、気にせずCUDAのサンプルをmakeしてコンパイルして、bin/linuz/releaseにいき、

./deviceQuery

したが、capableなビデオカードが見つからないとエラーを出された。
(通常はビデオカードの情報が出力される)

うおーっ!ってなって、

sudo sh ./cuda_5.0.35_linux_64_ubuntu11.10.run --uninstall
でアンインストールして、もう一回インストールしたりしたが、また、デスクトップが起動しなくなった。

最後の方は、記憶がないが、効いたっぽいのが、
http://sn0v.wordpress.com/2012/05/11/installing-cuda-on-ubuntu-12-04/
に書いてある。

sudo apt-get remove --purge nvidia*
によるnvidia関連のソフトウェアの全削除。

これやったあとに、

sudo sh ./cuda_5.0.35_linux_64_ubuntu11.10.run
でCUDAドライバのインストールをやり直したら、Compizも復活して、

./deviceQuery
でちゃんと結果が出力された。


どれが良かったか、わからないがこの中のどれかであるはず。

あと、「追加のドライバ(Additional driver)」から適当にExperimentalの一番新しいっぽいやつをインストールしたりもしたな…

Ubuntuでbootを逼迫している古いLinuxカーネルを削除

慣習に従って/bootディレクトリのパーティションを分けていたら(確か100M)、カーネルの更新のたびに、カーネルイメージがインストールされて、それが残って、/bootパーティションを逼迫していた。dist-upgradeができない状態に。
古いカーネルは不要なので削除する。ちなみに、Ubuntuのバージョンは12.04です。
インストールされているカーネルを確認する。

[*****@*****] $ dpkg -l | grep linux-image
rc  linux-image-3.2.0-23-generic           3.2.0-23.36                             Linux kernel image for version 3.2.0 on 64 bit x86 SMP
rc  linux-image-3.2.0-25-generic           3.2.0-25.40                             Linux kernel image for version 3.2.0 on 64 bit x86 SMP
rc  linux-image-3.2.0-26-generic           3.2.0-26.41                             Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii  linux-image-3.2.0-27-generic           3.2.0-27.43                             Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii  linux-image-3.2.0-29-generic           3.2.0-29.46                             Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii  linux-image-3.2.0-31-generic           3.2.0-31.50                             Linux kernel image for version 3.2.0 on 64 bit x86 SMP
iU  linux-image-3.2.0-32-generic           3.2.0-32.51                             Linux kernel image for version 3.2.0 on 64 bit x86 SMP
ii  linux-image-generic                    3.2.0.31.34                             Generic Linux kernel image
いっぱいある。結構たくさんある。なんとなく少しは戻れるように3.2.0-29以前を削除することにする
[****@***] $ sudo apt-get remove linux-image-3.2.0-2{3,5,6,7,9}-generic -y
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package linux-image-3.2.0-23-generic is not installed, so not removed
Package linux-image-3.2.0-25-generic is not installed, so not removed
Package linux-image-3.2.0-26-generic is not installed, so not removed
The following packages will be REMOVED:
  linux-image-3.2.0-27-generic linux-image-3.2.0-29-generic
0 upgraded, 0 newly installed, 2 to remove and 66 not upgraded.
15 not fully installed or removed.
After this operation, 298 MB disk space will be freed.
Setting up ubuntu-keyring (2011.11.21.1) ...
...(略) ...
Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-3.2.0-32-generic
よくみたら最初の方はrcだった。とりあえず、
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
してOK。df -hするとbootパーティションが半分くらい空いたが、また消すのめんどくさいな。
調べてみると、今の時代ではbootを別パーティションにする必要はないっぽい。
 参考:https://forums.ubuntulinux.jp/viewtopic.php?pid=12939

2012年10月16日火曜日

pyublasのメモ(vector、matrixの受け渡し)

受け渡しに関するメモ

ublas型でも受け渡しができるので便利、ただし、参照型はconstでしか受け取れない。
// コピーなし受け渡し、しかしmatへのアクセスは遅いらしい
template
pyublas::numpy_matrix takeAndReturn(
  pyublas::numpy_matrix mat)
{
 return mat;
}

// ただ返すだけ
template
pyublas::numpy_matrix returnNumpyMatrix(int numRow, int numCol)
{
 pyublas::numpy_matrix mat(numRow, numCol, 0);
 return mat;
}

// ublasをnumpyに変換して返してくれる
template
pyublas::numpy_matrix returnUblasMatrixAsNumpyMatrix(int numRow, int numCol)
{
 ublas::matrix mat(numRow, numCol, 0);
 return mat;
}

// ublasとして返しても変換テーブルで変換して返してくれる。C++で使っている関数がそのまま使える。
template
ublas::matrix returnUblasMatrix(int numRow, int numCol)
{
 ublas::matrix mat(numRow, numCol, 0);
 return mat;
}

// ublasにコピーして渡される
template
void takeUblasMatrix(ublas::matrix mat)
{
}

// コンパイルは通るが、実行時に怒られる
template
void takeUblasMatrixRef(ublas::matrix &mat)
{
}

// ublasに変換してコピーして渡される
template
void takeConstUblasMatrix(const ublas::matrix mat)
{
}

// constだと参照でも渡せる。
template
void takeConstUblasMatrixRef(const ublas::matrix &mat)
{
}

pyublas使うまでのメモ

環境はUbuntu12.04、Boostはインストール済みとする。ちなみに1.46

まずはPyUblasのインストール
ここから最新版をダウンロード http://pypi.python.org/pypi/PyUblas
tar xvzf PyUblas-VERSION.tar.gz
解凍して
cd PyUblas-VERSION
./configure.py --boost-python-libname=boost_python --use-iterators
sudo make install

boost-python-libnameは/usr/libにあるlibboost_python*.soのlibと.soを除いた部分を設定。
今回はCMakeでサンプルをビルドしてみた。別にMakeでもよい
cd test
すると
sample_ext.cppとsample.pyがある
自分で考えろという意味なのか、Makefileとかがない。
調べると必要なものは
Include: boost, python, pyublas
Library: boost_python, python
で、自分の環境では、
Include:
/usr/local/lib/python2.7/dist-packages/PyUblas-ほげほげ/include
/usr/lib/python2.7
Library:
/usr/lib/libboost_python.so
/usr/lib/libpython2.7.so
にあった

ちなみに、PyUblasのIncludeパスはhttp://documen.tician.de/pyublas/faq.html#where-do-the-headers-get-installedを参考に見つけた。

これを元に、Makefileを作っても良いが、楽をするために、CMakeでやった。

cmake_minimum_required(VERSION 2.8)

find_package(Boost COMPONENTS python REQUIRED)
find_package(PythonLibs REQUIRED)
find_path(PYUBLAS_DIR pyublas /usr/local/lib/python2.7/dist-packages/PyUblas-2011.1-py2.7-linux-x86_64.egg/include)

# 共有オブジェクトを作成する
add_library(
  sample_ext
  SHARED
  sample_ext.cpp
)

# インクルードディレクトリ -Iにあたる
include_directories(
  ${Boost_INCLUDE_DIRS}
  ${PYTHON_INCLUDE_DIR}
  ${PYUBLAS_DIR}
)

# リンクディレクトリ -Lにあたる
link_directories(
  ${Boost_LIBRARY_DIRS}
)

# リンク -lにあたる。libboost_python.soとlibpython2.7.soが設定されている
target_link_libraries(
  sample_ext
  ${Boost_LIBRARIES}
  ${PYTHON_LIBRARIES}
)

# libsample_extとならないようにする
set_target_properties(
  sample_ext
  PROPERTIES PREFIX ""
)

パッケージが見つからなかったときの処理とかは書いていない。
これをCMakeLists.txtというファイル名でsample_ext.cppと同じディレクトリにおいて、
そこから
mkdir build
ccmake ..
して見つからなかったところを設定して、(特にPYUBLAS_DIRのところ)
ジェネレートして、makeして、OKだったら
mv sample_ext.so ../
cd ..
python sample.py

2倍されている結果が帰ってくる