본문 바로가기

프로그래밍/C, C++

[Visual Studio 2015, C/C++] CPU 병렬처리 Multi-Thread (OpenMP)

728x90

관련 코드 설명

 - #pragma omp parallel {} : {}안에 코드를 각 Thread에서 실행해라

 - #pragma omp parallel for + for 문 : for 문을 Thread에 나눠서 실행해라

 - #pragma omp parallel sections { #pragma omp section{} } : section 별로 Thread 할당하여 실행해라

 

관련 함수 설명

 - omp_get_max_threads() : 현재 사용가능한 Thread 개수 반환

 - omp_get_thread_num() : 현재 사용하고 있는 Thread Number 반환

 

OpenMP 옵션 켜기

프로젝트 → 프로젝트 속성 → C/C++ → 언어 → OpenMP 지원을 예로 변경

OpenMP 옵션 켜기

 

Code (#pragma omp parallel)

#include <stdio.h>
#include <omp.h>

int main()
{
	#pragma omp parallel
	{
		printf("Id : %d\n", omp_get_thread_num());
	}
	return 0;
}

 

Result (#pragma omp parallel)

16개의 Thread가 각각 실행된 것을 확인할 수 있습니다.

결과

Code (#pragma omp parallel for)

#include <stdio.h>
#include <omp.h>

int main()
{
	#pragma omp parallel for
	for (int i = 0; i<32; i++)
	{
		printf("idx: %2d, ID : %2d\n", i, omp_get_thread_num());
	}
	return 0;
}

 

Result (#pragma omp parallel for)

 16개의 Thread가 32개의 for문을 2개씩 맡아서 실행한 것을 확인할 수 있습니다.

결과

 

Code (#pragma omp parallel sections)

#include <stdio.h>
#include <omp.h>

int main()
{
	#pragma omp parallel sections
	{
		#pragma omp section
		{
			for (int i = 0; i < 8; ++i)
			{
				printf("A. idx: %2d,  ID : %2d\n", i, omp_get_thread_num());
			}
		}
		#pragma omp section
		{
			for (int i = 0; i < 8; ++i)
			{
				printf("B. idx: %2d,  ID : %2d\n", i, omp_get_thread_num());
			}
		}
		#pragma omp section
		{
			for (int i = 0; i < 8; ++i)
			{
				printf("C. idx: %2d,  ID : %2d\n", i, omp_get_thread_num());
			}
		}
	}

	return 0;
}

 

Result (#pragma omp parallel sections)

 - 각 section에 Thread 할당하여 병렬로 실행된 것을 확인할 수 있습니다.

결과