본문 바로가기

Programming

OpenMP 변수 초기화의 문제


병렬화 구간에서 자꾸 에러가 나서(쓰레드 2개중 한개가 정상작동하지 않고 마치 무한루프를 도는 것 같은 문제)
무엇이 문제인가 싶어 로그파일을 작성해 보았습니다.

우선 문제의 코드를 보시죠. 아래의 변수중 문제가 발생했던 것은
neighbor_numb 라는 int 형 변수였습니다.

루프내에서 neighbor_numb는 초기화 과정 없이 바로 ++ 연산자를 이용해서
증가하도록 하고 있는데요, 초기화를 루프내에 넣어주지 않은 것은

#pragma 구문 앞에서 이미 변수선언을 할 때, = 0 으로 초기화를 해주었기 때문입니다.

로그파일을 뽑아보니, 쓰레드 1번에서는 해당 변수가 처음에 0 으로 제대로 초기화 된 것처럼 나옵니다.

그런데 0번 쓰레드에서는 이상한 쓰레기값이 들어가 있더군요.

초기화를 분명 해줬는데 ㅠ_ㅠ


#pragma
omp parallel for private(i, j, k, t_skip, t_dist_vect, t_distance, range_calc, neighbor_numb, array_numb) shared(m_data,  m_neighbor, t_distance_velocity)

               for( i = m_data->m_calc_start_num; i < m_data->m_calc_start_num + m_data->m_calc_atom_amount; i++)

               {




그래서 코드를 다음과 같이 변경했습니다.


#pragma omp parallel private(i, j, k, t_skip, t_dist_vect, t_distance, range_calc, neighbor_numb, array_numb) shared(m_data,  m_neighbor, t_distance_velocity)

        {           

               neighbor_numb = 0;

               t_skip = false;

               #pragma omp for

               for( i = m_data->m_calc_start_num; i < m_data->m_calc_start_num + m_data->m_calc_atom_amount; i++)

               {





우선 병렬화 구간에서 문제가 될 소지가 있는 변수들, 즉 루프내에서 특정 값 대입없이 증분을 이용하거나, 비교를 해야하는 변수들을

다시한번 초기화 시켜줍니다. 이렇게 시작하면 해당 변수에 쓰레기값이 들어가는 것을 막을 수 있는 것 같네요.

흠....=_=;;하나하나 문제를 해결해 가는 재미가 쏠쏠하긴 하군요.