728x90

병렬 영역 지정

#pragma omp parallel

{

 

}

 

스래드 개수 설정

- 환경 변수 : export OMP_NUM_THREADS=수

- 지시어 : #pragma omp parallel num_threads(수)

- 실행시간 라이브러리 : omp_set_num_threads(수)

 

스레드 관련 런타임 라이브러리(함수)

- omp_set_num_threads(수) : 스래드 개수설정

- omp_get_num_threads(): 현재 스래드 개수 반환

- omp_get_thread_num() : 현재 쓰래드 아이디 반환

 

 

프로그래밍 모델

- 스레드 기반

- 포크-조인 모델

 

포크-조인 모델

- 마스터 스레드는 병렬영역 끝에서 합쳐지는 스레드 모임 생성

- 동일 모임에 속한 스레드들이 공동 작업 수행

 

 

스레드 생성 예제

- 스레드 개수 출력 omp_get_num_threads()

- 스레드 3개 생성 #pragma omp parallel num_threads(3)

 -> 스래드 번호 omp_get_thread_num()와 스레드 개수 출력 omp_get_num_threads()

- 환경 변수에 지정한 만큼 스레드 생성

 -> 실행전 export OMP_NUM_THREADS=5

- 병렬 영역 밖에는 스래드 갯수가 1로 출력

 

 

 

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 9. firstprivate, shared, private  (0) 2020.07.29
openmp - 8. OpenMP과 메모리 공유  (0) 2020.07.29
openmp - 6. openmp 예제  (0) 2020.07.29
openmp - 5. OpenMP 시작하기  (0) 2020.07.29
openmp - 4. 잡 스캐줄러  (0) 2020.07.29
728x90

컴파일러 지시자와 함수로 스레드 갯수 설정하기

- 컴파일러 지시자 : #pragma omp parallel num_threads(2) -> 스레드 2개 설정

- 함수 : omp_set_num_threads(4) -> 스레드 4개 설정

 

 

 

컴파일러 지시자와 함수로 스레드 갯수 설정하기 - 결과

- 기본 스레드 만큼 출력 -> 4개 출력 -> 2개 출력

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 8. OpenMP과 메모리 공유  (0) 2020.07.29
openmp - 7. 스레드 관련  (0) 2020.07.29
openmp - 5. OpenMP 시작하기  (0) 2020.07.29
openmp - 4. 잡 스캐줄러  (0) 2020.07.29
openmp - 3. openmp와 opencv  (0) 2020.07.29
728x90

OpenMP

- Open specification for Multi Processing

- 라이브러리가 아님

- 다중 스레드 병렬 프로그래밍을 위한 API

- 포트란이나 C/C++에서 사용 가능

- 공유 메모리 프로그래밍 모델의 표준

- OpenMP 4.0부터 가속기 지원

 

 

OpenMP 구성

- 컴파일러 지시어 -> ex. #pragma omp parallel 

- 런타임 라이브러리(함수) -> ex. omp_get_thread_num() {스래드 번호 반환 함수}

- 환경변수 -> ex. export OMP_NUM_THREADS=10

 

 

OpenMP와 GPU, MPI?

- OpenMP에서는 코어 하나당 스레드하나

- GPU보다는 코어 위주로 사용

- 여러 노드를 사용하려면(멀티 프로세스) MPI 사용해야함

 

OpenCL

- intel, amd 그래픽 가속기의 경우 OpenCL 사용

 

Cuda

- nvidia 그래픽 가속기

 

 

 

OpenMP 런타임 함수 사용

- omp_get_thread_num() 해당 스레드 번호 반환 함수 사용

 

- 우측에 스래드 번호도 같이 출력됨

 

 

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 7. 스레드 관련  (0) 2020.07.29
openmp - 6. openmp 예제  (0) 2020.07.29
openmp - 4. 잡 스캐줄러  (0) 2020.07.29
openmp - 3. openmp와 opencv  (0) 2020.07.29
openmp - 2. 컴파일 시작하기  (0) 2020.07.29
728x90

 

openmp 프로그래밍과 계산 노드

- 여러 사람들이 계산 노드들을 나눠서 사용

=> 어떻게 나눠서 동작할까? job scheduler

- 아까보다 hello world가 더많이 출력된다.

 

 

 job scheduler

- 누리온에서 사용하는 잡 스캐줄러를 PBS라 부름

- 내가 어떤 작업을 하겠다고 명령들(작업 목록)을 만들어서 잡스케줄러에 제출해야함

 

 

잡 스캐줄러 명령어

작업 제출 qsub [script_file]
작업 삭제 qdel [job_id]
작업 조회 job_id qstat [job_id]
작업 조회 user_name qstat -u [user_name]
작업 큐 확인 showq

 

 

 

환경 변수로 스레드 갯수 설정

- openmp는 스레드 기반 병렬 처리 프로그래밍

- export OMP_NUM_THREADS=스레드 갯수

=> 10으로 설정후 omp 바이너리를 실행하면 10번 hello world가 출력

 

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 6. openmp 예제  (0) 2020.07.29
openmp - 5. OpenMP 시작하기  (0) 2020.07.29
openmp - 3. openmp와 opencv  (0) 2020.07.29
openmp - 2. 컴파일 시작하기  (0) 2020.07.29
openmp - 1. 개요  (0) 2020.07.29
728x90

예전에 opencv를 빌드할떄

 

cmake에서 병렬프로그래밍 처리를 할건지 물어보는 옵션이 있었다.

 

 

당시에는 openmp도 있고, cuda도 있으니까

 

 

둘다 하는게 좋지 않을까?

 

생각 들기도 했고 뭐가 뭔지 잘몰라

 

그냥 구글링에서 시키는데로 cuda만 추가하곤 했었다.

 

 

 

오늘 openmp를 공부하면서

 

이전에 있던 일이 생각나 openmp와 opencv에 대한 글을 찾았다.

 

 

OpenCV와 병렬 프로그래밍 (TBB, 꼭 설치해야 하나?)

https://kkokkal.tistory.com/1301

 

이 글에서 결론은 cuda가 훨씬 빠르니

 

cuda를 쓸수 있는 경우 병렬프로그래밍 처리를 할 필요가 없다고 한다.

 

 

다르게 말하면 cuda를 못쓰는 인텔 그래픽이나 amd만 있는 경우 병렬 프로그래밍을 추가하면 좋을듯 하다

 

하지만 cuda만큼 성능향상은없겠지만

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 6. openmp 예제  (0) 2020.07.29
openmp - 5. OpenMP 시작하기  (0) 2020.07.29
openmp - 4. 잡 스캐줄러  (0) 2020.07.29
openmp - 2. 컴파일 시작하기  (0) 2020.07.29
openmp - 1. 개요  (0) 2020.07.29
728x90

gcc와 openmp

- 대부분의 컴파일러에는 openmp가 지원됨

-> 컴파일러만 있으면 된다.

 

 

순차 프로그램 컴파일 표기

program vendor compiler expension
C/C++ intel icc/icpc .C, .cc, .cpp, .cxx,
GNU gcc/g++
Cray cc/CC
F77/F90 intel ifort .f, .for, .fpp
GNU gfortran
Cray ftn

 

컴파일 예시

$ {gcc | gfortran} -o test.exe [-03] [-march=knl] test.{c|f90}

$ {icc|ifort} -o test.exe [-03] [-march=knl] test.{c|90}

 

openmp 컴파일

$ {gcc | gfortran} -o test.exe -fopenmp [-03] [-march=knl] test.{c|f90}

$ {icc|ifort} -o test.exe -fopenmp [-03] [-march=knl] test.{c|90}

 

 

간단한 openmp 프로그래밍

- #pragma omp parallel 과 { }부분은 openmp 병렬 영역이라고 한다.

 

 

gcc로 openmp c코드 빌드 및 실행 결과

- -fopenmp 옵션을 준 경우 병렬로 처리해서인지 코어갯수만큼 hello world가 여러개가 뜬다

* openmp의 장점 : -fopenmp 옵션을 주고 뺴고의 차이에 따라 직렬, 병렬 프로그램으로 설정할 수있음

 

 

* .vimrc 파일 내용

- 출처 : https://blog.outsider.ne.kr/518

set nu
syntax on
set mouse=a
set nocompatible " 오리지날 VI와 호환하지 않음
set autoindent " 자동 들여쓰기
set cindent " C 프로그래밍용 자동 들여쓰기
set smartindent " 스마트한 들여쓰기 set wrap
set nowrapscan " 검색할 때 문서의 끝에서 처음으로 안돌아감
set nobackup " 백업 파일을 안만듬
set visualbell " 키를 잘못눌렀을 때 화면 프레시
set ruler " 화면 우측 하단에 현재 커서의 위치(줄,칸) 표시
set shiftwidth=4 " 자동 들여쓰기 4칸
set number " 행번호 표시, set nu 도 가능
set fencs=ucs-bom,utf-8,euc-kr.latin1 " 한글 파일은 euc-kr로, 유니코드는 유니코드로
set fileencoding=utf-8 " 파일저장인코딩
set tenc=utf-8 " 터미널 인코딩
set expandtab " 탭대신 스페이스
set hlsearch " 검색어 강조, set hls 도 가능
set ignorecase " 검색시 대소문자 무시, set ic 도 가능
set tabstop=4 " 탭을 4칸으로
set lbr
set incsearch " 키워드 입력시 점진적 검색
syntax on " 구문강조 사용
filetype indent on "파일 종류에 따른 구문강조
set background=dark " 하이라이팅 lihgt / dark
colorscheme desert " vi 색상 테마 설정
set backspace=eol,start,indent " 줄의 끝, 시작, 들여쓰기에서 백스페이스시 이전줄로
set history=1000 " vi 편집기록 기억갯수 .vim`info에 기록

 

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 6. openmp 예제  (0) 2020.07.29
openmp - 5. OpenMP 시작하기  (0) 2020.07.29
openmp - 4. 잡 스캐줄러  (0) 2020.07.29
openmp - 3. openmp와 opencv  (0) 2020.07.29
openmp - 1. 개요  (0) 2020.07.29
728x90

병렬 프로그래밍

- cpu를 병렬로 사용하여 성능을 개선시켜주는 프로그래밍 방법

- openmp와 mpi 가 있음

 

openmp

- 스레드 기반 병렬 프로그래밍

- 단일 컴퓨터 병렬

 

mpi

- 프로세스 기반 병렬 프로그래밍

- 여러 컴퓨터 병렬

 

 

 

실습

- 누리온 5호기 슈퍼컴퓨터 사용

- 하나의 cpu만 쓰면 일반 컴퓨터만 사용하는것과 다를것 없음

- 하나의 코어를 쓰기보다 64개 코어를 동시에 쓰는게 더 효율적임

=> 대표적인 방법이 openmp와 mpi

* 하나의 컴퓨터만 사용하는 경우 병렬화 openmp

 

 

 

병렬 프로그래밍에서의 시간

- 하나의 프로세스를 사용하는 시리얼 (순차) 프로그램 . 내가 독점하는 시간

   => 월클락타임 = cpu타임이 동일

- 여러사람이 나눠 사용하는 경우 os가 여러 사람의 요청을 들어주기 위해 시분할 수행

   => 월클락타임 * 1/(사용자 수) =cpu시간

* cpu 시간 : 내가 cpu를 점유한 시간

 

 

병렬 프로그래밍을 통한 소요시간의 차이

- 1개의 코어를 사용할때 1시간 소요

- 2개의 코어를 썻더니 30분 소요 => 2개의 cpu 타임은 동일

=> cpu 타임과 월클럭 타임은 다르다

 

 

 

 

 

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 6. openmp 예제  (0) 2020.07.29
openmp - 5. OpenMP 시작하기  (0) 2020.07.29
openmp - 4. 잡 스캐줄러  (0) 2020.07.29
openmp - 3. openmp와 opencv  (0) 2020.07.29
openmp - 2. 컴파일 시작하기  (0) 2020.07.29

+ Recent posts