トップ 最新 追記

yoggy's diary

〜せかいのすみっこから〜


2009-04-02

Macbook Pro(Unibody)のWindows VISTA環境でCUDAを使えるようにする手順メモ

VISTA環境でCUDAを使ってみたかったのですが、マシンがなかったのでMacbook Pro(Unibody)の Boot Camp環境にVISTAを入れて、そこでCUDAを使えるようにしたときの手順メモです。

以下の内容を試すときは、自己責任でお願いします。

(1) 最新のディスプレイドライバとCUDA SDKとCUDA ToolKitをダウンロード

いずれもVISTA用をダウンロードします。

ディスプレイドライバはここからダウンロード。バージョンは182.08を使用。

CUDA SDKとCUDA Toolkitはここからダウンロード。バージョンはCUDA 2.1の物を使用。

(2) ディスプレイドライバのインストール

ここが一番はまるポイントです。

Macbook Pro(Unibody)のBoot Camp環境では、GeForce 9600M GTを使えるようになっています。

6883108a47ae574304dce9cf16f6db11.png

しかし、ダウンロードしたディスプレイドライバのインストーラを動かすと 「ハードウェアが見つからない」と文句を言われてインストーラが途中で止まってしまいます。

b1a523e8a5aafdff92d0a04dc1bfd7dc.png

そこで、インストーラに入っているnv_disp.iniを次のように書き換えて インストーラに無理やりハードウェアを認識させます。

@@ -369,7 +369,8 @@
 %NVIDIA_C79.DEV_086D.1%  = nv_C9x_1SM,   PCI\VEN_10DE&DEV_086D
 %NVIDIA_C79.DEV_0871.1%  = nv_C9x_1SM,   PCI\VEN_10DE&DEV_0871
 %NVIDIA_C79.DEV_087A.1%  = nv_C9x_WS,    PCI\VEN_10DE&DEV_087A
-
+%NVIDIA_G96.DEV_0647.1%  = nv_G9x_HD,    PCI\VEN_10DE&DEV_0647&SUBSYS_00B0106B
+%NVIDIA_G96.DEV_0647.2%  = nv_G9x_HD,    PCI\VEN_10DE&DEV_0647&SUBSYS_00A9106B
 [ControlFlags]
 ExcludeFromSelect = *

@@ -1894,6 +1895,8 @@
 NVIDIA_C79.DEV_086D.1 = "NVIDIA GeForce 9200"
 NVIDIA_C79.DEV_0871.1 = "NVIDIA GeForce 9200 "
 NVIDIA_C79.DEV_087A.1 = "NVIDIA Quadro FX 470"
+NVIDIA_G96.DEV_0647.1  = "NVIDIA GeForce 9600M GT"
+NVIDIA_G96.DEV_0647.2  = "NVIDIA GeForce 9600M GT "
 DiskID1 = "NVIDIA Windows 2000/XP Driver Library Installation Disk 1"
 NVSVC.name = "NVIDIA Display Driver Service"
 NVSVC.desc = "Provides system and desktop level support to the NVIDIA display driver"

nv_disp.iniはC:\NVIDIA\WinVista\182.08\ISのディレクトリに入っています。

書き換えた後、C:\NVIDIA\WinVista\182.08\ISに入っているsetup.exeを直接実行すると、 インストーラは正しく(?)ハードウェアを認識して、ドライバがインストールされます。

メモ

ちなみに、PCI\VEN_10DE&DEV_0647&SUBSYS_00A9106Bとかの値については、 ハードウェアのプロパティを見ると確認することができます。

8d1bfc9597856f83f81cb911d8f07ee0.png

また、Max OS XのインストールDVDをWindowsから見るとBootcamp環境用のドライバが見えるのですが、 その中にあるBoot Camp\Drivers\NVidia\NVidiaSetup.exeを解凍すると出てくるnvao.infに Bootcamp環境用のグラフィックデバイスについての記述があるので、こちらを参考にしました。

nvao.infでは

%NVIDIA_C79.DEV_0863.1%  = nv_C51M_HD,   PCI\VEN_10DE&DEV_0863&SUBSYS_00AA106B
%NVIDIA_C79.DEV_0863.2%  = nv_C51M_HD,   PCI\VEN_10DE&DEV_0863&SUBSYS_00AC106B

という記述がありますが、nv_C51M_HDについては、元のドライバにあるnv_G9x_HDに置き換えています。

nv_G9x_HDとかは何か?というと、インストールする内容を指定する識別子のようです。 nv_disp.infの中に[nv_G9x_HD]というセクションがあり、何をインストールするか?が定義されています。なので、nvao.infにあるnv_C51M_HDをそのままnv_disp.infで指定しても、インストールする対象がないためインストーラは正しく動きません。nv_disp.infにあるものに適切に書き換える必要があります。

(3) CUDA SDKとCUDA Toolkitのインストール

CUDA SDKとCUDA Toolkitはインストーラですんなりインストールすることができます。

(4) 動作確認

CUDA SDKのサンプルプログラムがC:\ProgramData\NVIDIA Corporation\NVIDIA CUDA SDK\bin以下に 入っているので、これを動かしてみて正常にCUDAが使えることを確認してみてください。

5eeb1f4830488006f98a57d0a738012c.png

おわりに

Boot Campで提供されているVISTA用のディスプレイドライバが元からCUDAに対応していたらいいのですが、 これはAppleがドライバをアップデートしてくれないのかなぁ…と思います。

あと、Mac OS XでCUDA使えばいいじゃんいう声も聞こえてきそうですが、気にしない方向でw


2009-04-05

Project Eulerのススメ

最近、頭の体操ということで、先週ぐらいからProject Eulerをちまちま解いています。 Project Eularは何かというと

What is Project Euler?

Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.

http://projecteuler.net/ より

という感じで、数学の知識とプログラミング技術を駆使して回答する問題が出題されているサイトです。 いまのところ問題は全部で239問用意されています。

3411679405_cd2c879dac.jpg

問題自体はユーザ登録しなくても見ることはできるのですが、 答えが合っているかどうかチェックしたいときは、 ユーザ登録してフォームに解答すると正解しているかどうかを確認することができます。

3411739555_5268fe202f_m.jpg

ログインしていると正解した問題については、こんな感じで問題一覧に緑のチェックマークがつきます。

3411679205_f535115dcb_m.jpg

問題の解答については時間制限も無く、好きな時間にのんびりじっくり考えたりプログラムを組んだりして回答できるので、自分のペースで進めることができると思います。私は平日の通勤時間とか寝る前とかに少しだけ時間を作ってちょっとつづ進めいています。

  • 逆にTopCorderのSRMのように開催時間が決まっていたり、競技色が強いところがあると、ちょっと参加しづらいなーと思わないでもないです。。

問題の内容についてですが、数学(ジャンルで言うと主に数論)の知識だけがあっても微妙に解けないし、 プログラミング技術だけがあっても微妙に解けないという、かなり絶妙なバランスの問題になっていると思います。

英語で問題が書かれていて意味がよくわからないぜーということがあるのですが、 そんな時は、ありがたいことに以下のサイトで問題文の日本語訳が公開されています。

内容的には、明日からすぐに使える技とか即効性がある技術が身に付くわけではなく、 明日からプログラムをバリバリ書けるようになることはまず無いと思うのですが、 Project Eularを通じて、

  • 自分で問題の解き方の戦略をしっかり考える
  • じっくりアルゴリズムを詰める
  • 必要に応じて、回答の助けになる数学の知識を少し勉強する

というプロセスを続けていると、地味だけれども確実にプログラマとしての底力がついてくるところが 良いのではないかな?と思います。

追記:タイトルで"Euler"のつづりを間違えてたので修正しました。Eulerさんすみませんでしたっ(汗


2009-04-12

RubyのPrimeクラスの高速化とエコ・コンピューティングな話

Project Eulerの問題には

  • 素数に対して何かする問題
  • 素数かどうかを判定する必要がある問題

と、たまに素数を使う問題が登場します。

自力でいくつか問題を解いていて気がついたのですが、 問題のたびに毎回Prime#succで求めていたらなんかもったいないような気がしてきたので、 以下のprime_table.rbを使って、mathnライブラリのPrimeクラスを置き換えてみました。

#!/usr/bin/ruby
require 'mathn'

$prime_table_cache_file = ".prime_table_01"

unless File.exists?($prime_table_cache_file)
  system("wget http://primes.utm.edu/lists/small/millions/primes1.zip") unless File.exists?("primes1.zip")
  system("unzip primes1.zip")  unless File.exists?("primes1.txt")
  system("nkf -Lu --overwrite primes1.txt")

  count = 4
  fw = open($prime_table_cache_file, "w")
  open("primes1.txt","r") {|f|
    while l = f.gets
      #先頭4行は読み飛ばし
      unless count == 0
        count -= 1
        next
      end

      a = l.strip.split

      next if a.size == 0
      a.each{|s|
        fw.puts s
      }
    end
  }
  fw.close
end

$prime_table = []
open($prime_table_cache_file, "r") {|f|
  while str = f.gets
    $prime_table << str.to_i
  end
}

class Prime
  def initialize
    @pos = -1
  end

  def succ
    @pos += 1
    $prime_table[@pos]
  end
end

ひねりがないなーと自分でもあきれるぐらい直球すぎる実装なのですが、 The Prime Pagesというサイトから 計算済みの2から15,485,863までの100万個の素数テーブルを取ってきて、 そのファイルを使ってPrime#succの値を返しているだけです。

テーブルを使っているので、Prime#succが超高速に値を返すのは当たり前なのですが、

#!/usr/bin/ruby
require 'mathn'
#require 'prime_table'   #<-テーブルを使う場合この行をコメントアウト

prime = Prime.new
(1..100000).each{|n|
  n.prime_division
}

のような素因数分解なども早くなります。以下はMac mini(1.66GHz Core Duo)で 比較した結果です。

※mathnのPrime#succを使った場合
$ time ./prime_test.rb
./prime_test.rb  93.47s user 0.19s system 99% cpu 1:33.84 total

※require 'prime_table'を使った場合
$ time ./prime_test2.rb  (※テーブルがある状態で計測)
./prime_test.rb  14.99s user 0.08s system 99% cpu 15.130 total

単に使うだけなら素数とかの誰が計算しても同じになる結果は、世界中で同じ計算をしてると あんまりエコじゃないような気がしたので、どこかにこういう結果を共有できるサイトを用意して、 簡単にプログラムから使えるようになってるとうれしいのかな?という気がしました。

検証とかアルゴリズムの勉強とかで自力でプログラムを作って計算したい場合は話は別なのですが、 さすがに素数5000万個を個人の手持ちの機材で求めるのはかなり厳しいので、 こういう貴重な計算結果を公開してくれているThe Prime Pagesはすごいなーと思います。

ふと、エコという意味で、素数5000万個をAmazon Elastic MapReduceとかで計算するといくらぐらいかかるのかが気になりました…


トップ 最新 追記

2003|01|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|
2010|01|02|03|