본문 바로가기

openmp

OpenMP의 성능향상을 위한 시도 OpenMP를 통하여 가장 큰 이득을 볼 수 있는 부분은 단연코 for 등의 루프에 의한 반복연산을 각각의 프로세서로 분할하여 계산하는 것일텐데, 일반적으로 분할하는 방법은 예를 들어서 for( int i = 0; i < NUM ; i++) ..... 여기에서 NUM을 프로세서의 갯수로 나누어 각각 일정한 수의 계산을 가져가서 계산을하고 이 값을 토대로 다음스텝으로 넘어가는 작업이 되겠다. 예 - 4 core 시스템이라면 , NODE 1 : 0~NUM/4 NODE 2 : NUM/4~NUM/2 NODE 3: NUM/2~NUM3/4 NODE 4: NUM3/4~NUM 이런식으로 작업을 가져가게 될텐데, 각각의 작업이 계산량이 거의 일정하다면 큰 문제가 되지 않는다. 그러나, 계산량에 극심하게 차이가 나는 경우.. 더보기
OpenMP 변수 초기화의 문제 병렬화 구간에서 자꾸 에러가 나서(쓰레드 2개중 한개가 정상작동하지 않고 마치 무한루프를 도는 것 같은 문제) 무엇이 문제인가 싶어 로그파일을 작성해 보았습니다. 우선 문제의 코드를 보시죠. 아래의 변수중 문제가 발생했던 것은 neighbor_numb 라는 int 형 변수였습니다. 루프내에서 neighbor_numb는 초기화 과정 없이 바로 ++ 연산자를 이용해서 증가하도록 하고 있는데요, 초기화를 루프내에 넣어주지 않은 것은 #pragma 구문 앞에서 이미 변수선언을 할 때, = 0 으로 초기화를 해주었기 때문입니다. 로그파일을 뽑아보니, 쓰레드 1번에서는 해당 변수가 처음에 0 으로 제대로 초기화 된 것처럼 나옵니다. 그런데 0번 쓰레드에서는 이상한 쓰레기값이 들어가 있더군요. 초기화를 분명 해줬는데.. 더보기
OpenMP에서 동적할당된 메모리를 private 형식으로 잡기 for 문에서 OpenMP에서 동적으로 할당된 배열을 Private으로 잡고자 할 때, 그냥 #pragma omp parallel for private(i, j, d, c) shared(a, b) 이런식으로 잡았다가는 동적으로 할당된 배열 (여기에서는 c 가 배열입니다) 을 제대로 접근하지 못하고 이상한 쓰레기값을 자꾸 참조하더군요 그래서 뭐가 문제인가 싶어서 찾아봤습니다. 해답은 여기~ http://stackoverflow.com/questions/2352895/how-to-ensure-a-dynamically-allocated-array-is-private-in-openmp 방법은 parallel 구문 내에서 해당 변수를 동적으로 할당하고 사용하면 된다는 내용입니다. 간단한 소스를 첨부합니다. (소스.. 더보기
MPI 와 OpenMP의 공존가능성에 대한 간단한 테스트 네트웍으로 여러개의 컴퓨터를 링크하고 동시에 컴퓨터 내부의 코어를 엮어서 병렬 컴퓨팅의 성능을 최대한 끌어올리기 위한 시험을 수행중입니다. MPICH2를 이용하여 각 컴퓨터를 네트웍으로 엮고, 이어서 내부적으로 코어를 모두 활용하기 위해 OpenMP를 적용했습니다. 우선 MPICH 코드가 내장된 상태에서 OpenMP가 어떻게 작동하는지 확인하기 위하여 일단은 듀얼코어만 활성화 시켜서 테스트 해본 결과 다음과 같습니다. OS 환경은 Win7 64bit OpenMP를 이용해서 코어2개를 모두 사용할 경우 (CPU 점유율 99%) OpenMP를 사용하지 않을 경우 (CPU 점유율 60~70%) 대강 보아하니 CPU 점유율 정도의 차이가 발생하네요 흠-_- Win7은 이번에 처음 써보는 거라 생소하긴 한데, X.. 더보기