CAFE

댓글

뒤로

다음과 같은 경우에는 어떻게 병렬처리를 해야 될지 궁금합니다.(source코드 부분 수정했습니다.)

작성자바람의기사| 작성시간12.04.27| 조회수111| 댓글 4

댓글 리스트

  • 작성자 가야인 작성시간12.04.27 안녕하세요.
    fout << dev << "\t\t\t" << first_dev[i] << "\t\t\t" << second_dev[i] << endl; <-- 이부분에서 hotspot이 나올 수 있겠네요.
    IO관련 된 부분에서 시간을 많이 잡아요.. 그래도. 어쩔 수 없이.적용해야 한다면.. 그대로 진행해야 겠죠.. ^^
    혹시 openmp parallel for를 적용해 보셨나요? 데이터 레이싱이 나올 것 같은데요..
    for문을 단순화 시키는 것도 하나의 방법인데요.. 혹시, advisor를 사용해 보셨나요?
    (컴파일 할 수 있는 전체 소스가 공개가 가능하면 다른들분이 분석하기 좀 쉽게 진행 할 수 있을 것 같아요. )
  • 작성자 가야인 작성시간12.04.27
    아래와 같이 데이터 분할이 가능한지 테스트 해보는 것도 좋은 방법입니다.
    값이 틀리다면 데이터 레이싱을 의심 해야 합니다.

    #pragma omp parallel sections{
    #pragma omp section
    {
    for(long i =0; i < Max_steps-1/2; i++)
    {
    ~~~~
    }

    }
    #pragma omp section
    {
    for(long i=Max_steps-1/2 =; i < Max_steps-1; i++)

    {
    ~~~~

    }
    }

    }

  • 작성자 바람의기사 작성자 본인 여부 작성자 작성시간12.04.30 안녕하세요. race condition 문제보다는 이게 보통의 parallel for 를 하면 task가 분할되니 처음쪽을 제외하고는 전부 0이 나오네요.(디버깅 해보니.) 즉 first_dev[i+1]은 first_dev[i]를 알아야 되는 구조인지라..
    그리고 source code올렸습니다. IDE는 VS2010, complier는 intel c++ 12.0 cpu는 i7-2600입니다.
  • 작성자 가야인 작성시간12.05.11 안녕하세요. 이제서야 소스 코드를 보았습니다.

    예를 했지만, fout << dev << "\t\t\t" << first_dev[i] << "\t\t\t" << second_dev[i] << endl; --> 이부분의 대부분의 CPU 시간을 잡고 있더군요.
    I/O 부분을 있는 곳을 잘 못 병렬화 하면, 병렬화의 효과를 못 보고, 더 속도가 느려질 수 있습니다.

    제가 이부분을 제외하고 간단한 실험을 했는데, 의외로 계산 소스 코드 부분 보다(for), 시리얼 부분의 시간이 많이 걸려서, 병렬화의 효과가 없었습니다.
    여기 지면이 작으니, 정리가 되는데로 게시판에 다시 설명을 하도록 하겠습니다.
맨위로

카페 검색

카페 검색어 입력폼
카카오 이모티콘
사용할 수 있는 카페앱에서
댓글을 작성하시겠습니까?
이동시 작성중인 내용은 유지되지 않습니다.