乱数を使って円周率もどきを求める2

先日試した乱数を使った円周率を求める方法を
numpyを使った方法に置き換えた。

import math
import time
import numpy as np


def calc_pi ( NN ):
  arr1 = np.random.rand(NN)
  arr2 = np.random.rand(NN)
  arr3 = np.sqrt(arr1 * arr1 + arr2 * arr2)
  arr3[arr3 > 1] = 0   #1より大きい要素は0に
  arr3[arr3 > 0] = 1   #0より大きい要素は1に
  in_n = np.sum(arr3)  #円内に入ったやつの合計

  return ( in_n / NN ) * 4


if __name__ == "__main__":

  for j in range (1,9):
    NN = 10 ** j
    start_time = time.perf_counter()
    pi = calc_pi(NN)
    execution_time = time.perf_counter() - start_time
    delt = math.fabs(math.pi - pi)
    print (str(NN).rjust(10),"  ",f'{pi:11.010f}',"  ",f'{delt:7.06f}',"  ",execution_time)

実行結果

   試行回数        結果      誤差     処理時間[sec]
        10    2.8000000000    0.341593    8.769400028540986e-05
       100    3.1200000000    0.021593    4.6955000016168924e-05
      1000    3.1960000000    0.054407    5.6955000218295027e-05
     10000    3.1420000000    0.000407    0.0003660469997157634
    100000    3.1376400000    0.003953    0.0036325510000096983
   1000000    3.1415240000    0.000069    0.03182136600025842
  10000000    3.1416492000    0.000057    0.2625446400002147
 100000000    3.1416174400    0.000025    2.535640128000068

numpy使わずにwhileで計算していたまえの処理に較べて15倍位早い結果。全て配列に収めてから処理するとさすがに早い。ただしメモリもバカ喰い。

乱数を使って円周率もどきを求める

乱数を使った円周率もどきを求めてみる

下記のような正方形と内接する円を考える。正方形の1辺は2としておく。この正方形の中にランダムに点を打った際、円の中にも入る確率は 円の面積 / 正方形の面積。つまり、確率  =  π / 4  となる。

 

 

π  =  正方形内にランダムに点を打った           際に円の中に入る確率は  ×  4  

 

 

 

ランダムに打った点が円の中に入ったかどうか?はx座標とy座標にそれぞれ0~1の乱数を与えてやり、sqrt(x^2  + y^2)  が1以下であれば円の中といえる。

 

 

この処理を実装したものが下記

import random
import math
import time

def calc_rad (x, y):
  return math.sqrt(x*x +  y*y)


def calc_pi ( NN ):
  num  = 0
  in_n = 0
  while num < NN:
    x = random.random()
    y = random.random()
    if calc_rad (x, y) <= 1:
      in_n = in_n  + 1
    num = num + 1

  return ( in_n / num ) * 4


if __name__ == "__main__":
  for j in range (1,9):
    NN = 10 ** j
    start_time = time.perf_counter()
    pi = calc_pi(NN)
    execution_time = time.perf_counter() - start_time
    delt = math.fabs(math.pi - pi)
    print (str(NN).rjust(10),"  ",f'{pi:11.010f}',"  ",f'{delt:7.06f}',"  ",execution_time)

実行結果

   試行回数        結果      誤差     処理時間[sec]
        10    3.6000000000    0.458407    1.1099999937869143e-05
       100    2.9600000000    0.181593    4.040199928567745e-05
      1000    3.0800000000    0.061593    0.0004007130000900361
     10000    3.1616000000    0.020007    0.004138636999414302
    100000    3.1487600000    0.007167    0.042758481000419124
   1000000    3.1437800000    0.002187    0.4172533930004647
  10000000    3.1411992000    0.000393    4.038885087000381
 100000000    3.1415664400    0.000026    41.15365210999971

それなりに近い値かな?

centos7にてpycudaをインストール(pip3)

pycudaを下記コマンドからインストールを試したところ、、、

pip3 install pycuda

エラーでストップ。
pycudaのコンパイル時にcuda.hがないとのメッセージで死んでいる。

このエラーについてググるとコンパイル時のPATH/
CPATH/LIBRARY_PATH等にcudaのpathを追加で
対応可能と出てくるが自分の環境では改善せず。。

自分のところでは、gccのバージョンを上げることでエラーが消えて
インストール成功した。gccの対応バージョンがあるっぽい。

エラー時:gcc version 4.8.5 20150623
成功時 :gcc version 7.3.1 20180303

centos7にcudaをインストール

CUDAはNVIDIAが開発・提供しているGPU向けの汎用並列コンピューティングプラットフォーム。専用のC/C++コンパイラ (nvcc) やライブラリ (API) などが提供されている(wiki)。

NVIDIAのサイトからOS/アーキテクチャにあったToolkitをダウンロード。
https://developer.nvidia.com/cuda-downloads


※wget方式でのコマンドラインが指定される。

wget https://developer.download.nvidia.com/compute/cuda/11.5.1/local_installers/cuda_11.5.1_495.29.05_linux.run
sudo sh cuda_11.5.1_495.29.05_linux.run


acceptと入力してEnter


とりあえず全部にチェック入れてInstall

インストールの際はUIをGUIからCUIに変更しておく(参考)。

 

インストールした結果が下記

centos7でNVIDIAドライバのインストール

centos7にてGeForce GTX 1060を使えるようにする為、
NVIDIAのドライバインストールをする。

 

現在利用可能なVGAの確認

% lspci | grep VGA

lspci

cpuに搭載されているUHD Graphics 630とGeForce GTX 1060 6GBが認識されていることが確認できる。

 

NVIDIAのサイトから上記に対応したドライバをダウンロード
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

NVIDIA_DL_SITE

 

システム起動時のUIをGUIからCUIに変更しておく
default.targetのリンク先をGUI時のgraphical.targetから
CUI用のmulti-user.targetに変更する。

% cd /etc/systemd/system
% sudo unlink default.target
% sudo ln -s multi-user.target default.target

 

システムに反映させて再起動させる

% sudo dracut --force 
% sudo reboot

 

ダウンロードしたドライバをインストールする
bash NVIDIA-Linux-x86_64-470.94.run

bash NVIDIA-Linux-x86_64-470.94.run

 

インストールが完了したら下記コマンドでグラフィックカードの状態を確認することができる。

% nvidia-smi

nvidia-smiの結果