10여년간 병렬 프로그래밍을 하지 않았던 분이 GO에서 오랜만에...

7735 단어 MPIGo병렬 처리

개시하다


Qiita의 계정은 오래전에 만들어졌지만 계속 놓여 있습니다.그런데 저번 주에 갑자기 저희 회사 advent 달력이 생겼어요.
개방 흐름 Advent Calendar 2017
참가해야 하기 때문에 활용하기로 했습니다.

뭐 해요?


저는 학창시절에 슈퍼컴퓨터를 목표로 하는 병렬 파일 시스템이나 병렬 데이터 접근 기구를 연구했는데 그 당시MPI를 사용했습니다.
그리고 취직 후 인터넷이 된 사람들은 그런 세상과 완전히 멀어졌지만, 웹의 세계는 틀림없이 재미있었지만, 학창시절에 얻은 것은 그다지 역할을 발휘하지 못해 풀이 죽은 면도 있었다.
하지만 최근 온라인에서도 이렇게 병행 처리, 병행 처리가 화제다.그리고 오랜만에 가장 가까운 환경에서 해보니까 Go 언어 간단하고 좋은 것 같아요.그래서 해봤어요.
이 투고에서 Go로 샘플성 병행 처리를 시도해 봤는데 터치MPI 때와 비교하면 어때요?나는 이와 유사한 말을 하고 싶다.나는 지금의 말이 반드시 쉽게 할 수 있을 것이라고 굳게 믿는다

이렇게 생각하면...


이렇게 하면 같은 부가 달력인 것 같아요.
개방 흐름 Advent Calendar 2017
쓰는 단락 때문에 화제가 생겼다.(※ 12월 3일 단락)
MPI 병렬 프로그램을 통해
https://qiita.com/ojisann/items/cea6031863886a2eef67
오, 회사에서 사용하는 사람이 있어서 놀랐어요.대학을 떠난 후 자신을 제외한 누구도 MPI를 처리하는 사람을 본 적이 없다.
그렇게 말하지만 그쪽은 자기가 예전에 만든 MPI라서 괜찮을 거예요.그리고 이 정도면 정말 드문 일인데, 이렇게 말하기보다는 소재 찾기가 어려워서 소재도 받아서 죄송합니다

Go는 어떤 녀석이냐.


뭐, 흔하지만 약속이니까 쓰세요.
golang.웹 페이지 정보
http://golang.jp/
Go 언어에 따라
Go言語は、Linux、Mac、Native Clientで動作する開発言語で、Android携帯上でも動作します。
まだ発表されたばかりなのでこれからの動向が注目されています。

特徴はGoogleによると・・

・シンプルな言語である。
・コンパイル・実行速度が早い。
・安全性が高い。
・同期処理が容易に行える。
・なにより楽しい。
・オープンソースである。
뭐?뭐랄까, 특징을 보고도 가장 주목해야 할 부분의 병행 처리라고 강조하지 않았지만 신경 쓰지 마세요.확인했으니까 돼.

비교해 보다


간단히


Go의 언어 방법은 비교적 간단한 것 같다.간단하면 좋은 일이다.빨리 기억할 수 있어.MPI를 외우는 것은 비교적 어렵다.MPI는 이름과 같은 C++ 프로그램 라이브러리와 이 프로그램의 사전 컴파일 환경을 포함하고, 병렬 처리를 실행하는 케이스 스크립트 (파라미터로 실행할 대상 코드를 지정하는 것) 를 통해 만든 실행 환경을 포함합니다.각양각색의 노드에 설치되어 있기 때문에 먼저 사용하기 전에 기억해야 할 것이 매우 많고 번거롭다.

많은 일본어 자료


Go 언어에 일본어 자료가 많아서 정말 감사합니다.설치와 샘플 소스, 찾아보면 많을 것 같아요.그와 상대적인MPI은 그야말로 사막 같은 환경이다.아무래도 일본어는 고사하고 영어조차 제대로 된 문헌이 없어 서양서와 MPI 양식의 초안 한 권에 의존할 수밖에 없었다.그 외국 책의 일본어 번역본이 출판되었다는 것은 오랜 시간이 지나서야 알았다.
쉽게 할 수 있을 거야 Go 대승이지.

환경을 만들다


환경 구축은 이곳을 참고했다.
첫 번째 Go 언어(on Windows)
https://qiita.com/spiegel-im-spiegel/items/dca0df389df1470bdbfa
Windows Visual Studio Code로 Go 언어 개발 환경 조성(2017년 7월)
http://blog.shibata.tech/entry/2017/07/20/211442
아무것도 없는 상태부터 각종 장치를 부착해 바삭바삭하게 만들었다.
VSC를 처음 다운로드한 후 Hello World까지 약 15분 정도 걸립니다.간단하네.
너무 간단해서 특별히 쓸 게 없어요.
VSC 콘솔에서 Go 버전을 확인하면 완료됩니다.
PS C:\home\Go> go version
go version go1.9.2 windows/amd64
PS C:\home\Go>
Windows로 개발하면 이전(20년 전)에는 허용되지 않았습니다.말하자면 당시MPI의 Windows 설치는 아직 수수께끼가 없었다.그럼에도 불구하고 Windows의 OSS 개발 환경은 간단해졌습니다.좋은 시대야.

제목.


그럼 아까 선배의 단락은 몬테카로법으로 원주율을 계산한 거예요.거리 수치 계산이 상당히 멀어 이름은 알지만 알고리즘이 기억나지 않아 찾아보니 발견됐다.구글 선생님 짱이다.제목으로도 쉬우니까.
  • 몬테카로 방법과 원주율의 근사 계산https://mathtrain.jp/montecarlo
  • 円周率の近似値を計算する方法
    
    モンテカルロ法の具体例として有名なのが円周率の近似値を計算するアルゴリズムです。
    
    モンテカルロ法
      1. 1×1 の正方形内にランダムに点を打つ
      2. 原点(左下の頂点)から距離が 1 以下なら 1 ポイント,1 より大きいなら 0 ポイント追加
      3. 以上の操作を N 回繰り返す,総獲得ポイントを X とするとき,4X/N が円周率の近似値になる
    
    여기에는 정사각형 안에도 경계선이 포함된 것 같다.[0,0]~[1,1] 안이죠.

    일단 솔직하게 순서대로 써보도록 하겠습니다.


    참조 사이트:
    몬테카로 방법을 이용하여 원주율(하나)을 추정하다
    http://text.baldanders.info/golang/estimate-of-pi/
    제재가 만재하다.뭐, 소스를 그냥 말해도 기교가 없어서 조금 바꿨어요.
    위에서 말한 바와 같이 Go 랜덤수를 생성하는 표준 함수는 [0.0,1.0)이고 주지 않는다1.0.거기서 조금 공예를 해볼게요.
    float64(rand.Int63n(10000001)) / float64(10000000))
    
    이렇게 하는 것이 비교적 좋다.그리고 정사각형 안의 좌표와 원점 라인의 거리를 사용한다math/cmplxパッケージ
    p := complex(float64(rand.Int63n(10000001))/float64(10000000), float64(rand.Int63n(10000001))/float64(10000000))
    length := cmplx.Abs(p)
    
    이런 형식으로 표현하다.
    그리고 이 점을 판단하고 합계하면 이런 코드가 된다.
    참고 사이트를 바탕으로 대충 이런 느낌일 거예요.
    package main
    
    import (
        "fmt"
        "math/cmplx"
        "math/rand"
        "time"
    )
    
    func main() {
        n := int64(100000)
        rand.Seed(time.Now().UnixNano())
        m := int64(0)
        for i := int64(0); i < n; i++ {
            p := complex(float64(rand.Int63n(10000001))/float64(10000000), float64(rand.Int63n(10000001))/float64(10000000))
            if cmplx.Abs(p) <= float64(1) {
                m++
            }
        }
        fmt.Printf("n = %v, m = %v, 4m/n = %v\n", n, m, float64(4*m)/float64(n))
    }
    

    병행화


    어느 부분을 병렬화하는가, 제재가 매우 간단하기 때문에, for분의 내용을 병렬화한다.
  • 랜덤 포인트 생성
  • 제작된 점과 원점의 거리를 계산
  • 판정점수
  • 이런 데야?이번엔 간단하니까 바로 답이 나오는데 여길 생각하기 힘들지...여길 생각하는 부분은 예나 지금이나 변함이 없다.
    참조 페이지에서
    · 제작된 점과 원점의 거리를 계산한다
    판정 점수
    이 부분은 병렬화되지 않았기 때문에 이번 결정은 이쪽으로 병렬화되기로 했다.
    병렬 처리에서 중요한 것은 분산 처리 데이터의 맵과 수집 결과의 ReduceMPI라면 최초의 초도에는 그런 것이 없었을 것이다.주 노드로 수집된 처리는 스스로 쓸 수밖에 없다는 것이다.근데 확실히 사용하면서 버전이 업그레이드돼서 설치된 것 같아서요.역시 없으면 불편하네요.Go의 경우 채널을 제작해 투입해 임의로 수집할 수 있어 편리하다.신경을 많이 쓰는 일을 하려면 어려울 수 있지만 대부분의 용도는 이렇게 해결되는 거죠.
    따라서 위의 소스를 병행화한 소스는 여기에 있다.
    package main
    
    import (
        "fmt"
        "math/cmplx"
        "math/rand"
        "time"
    )
    
    func main() {
        my_rand := rand.New(rand.NewSource(1))
        my_rand.Seed(time.Now().UnixNano())
        n := int64(1000000)
        m := int64(0)
        c := culc(my_rand, n)
        for q := range c {
            m = m + q
        }
        fmt.Printf("n = %v, m = %v, 4m/n = %v\n", n, m, float64(4*m)/float64(n))
    }
    
    func culc(s rand.Source, count int64) <-chan int64 {
        ch := make(chan int64, int64(10))
        r := rand.New(s)
        go func(r *rand.Rand, count int64) {
            for i := int64(0); i < count; i++ {
                p := complex(float64(r.Int63n(10000001))/float64(10000000), float64(r.Int63n(10000001))/float64(10000000))
                if cmplx.Abs(p) <= float64(1) {
                    ch <- int64(1)
                } else {
                    ch <- int64(0)
                }
            }
            close(ch)
        }(r, count)
        return ch
    }
    
    뭐, 비교적 가볍다.샘플을 배운 후 병행화 부분은 함수로 잘라내는 형식으로 바뀌었다.MPI에 국한되지 않았지만 당시의 병렬 프로그램 설계는 처음부터 병렬 처리로 전체를 고려하고 쓰지 않았기 때문에 순서대로 처리된 코드를 병렬 처리로 바꾸면 번거로웠다.
    그것에 비하면 지금은 훨씬 수월하겠지.

    실행


    실행 결과는 다음과 같습니다.
    버전 순서 처리 결과
    PS C:\home\Go> .\test.exe
    n = 1000000, m = 785733, 4m/n = 3.142932
    PS C:\home\Go>
    
    병렬 처리 버전 결과
    PS C:\home\Go> .\test_p.exe
    n = 1000000, m = 786196, 4m/n = 3.144784
    PS C:\home\Go>
    
    둘의 수치는 미묘한 차이가 있고, 실험 횟수가 적은 경우도 있죠.근데 100만 번도 3.14밖에 안 나오잖아.

    총결산


    바삭바삭하고 환경을 만들고 소스를 쓰는 게 (처음이지만 시간이 많이 걸렸어요) 비교적 가볍게 병행화되는 것 같아요.
    예전보다 훨씬 간단해졌고 기억할 것도 적어졌으니 끊임없이 사용하면 좋을 것 같아요.
    나는 젊은이들이 예전처럼 그렇게 고생할 필요가 없다고 생각한다.

    좋은 웹페이지 즐겨찾기