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
728x90

os만들기 - 2에서 한 모든 일들은 다 쓸모없는 짓이었다.

 

 

 

나중에 다시보니

 

지금 하는 바이너리 파일 만드는건

 

모든 바이너리 코드들을 내 마음대로가 아니라 똑같이 만들어야 부팅가능한 이미지가 만들어지더라

 

왜 계속 아무리 돌려봐도 실행이 안되나 싶었더니

 

부팅 가능한 기계어 코드를 만드는 예제 인데

 

정해진 대로 안한 채 내가 마음대로 치고

 

부팅 가능한 이미지를 만들겠다고 이것 저것 툴만 만지고 있었다.

 

 

 

 

아무튼 정해진 주소에 코드를 올바르게 입력했더니

 

무슨 뜻인지 모를 이진 코드 이미지가 일단 부팅은 가능한 상태가 되었다.

 

 

 

 

 

 

여기서 바이너리에디터로 조금만 수정하면

 

hello world가 출력된다.

 

 

 

오늘 한 내용은

 

기계어 수준으로

 

부팅 가능한 플로피 이미지를 만들고 hello, world를 출력하는 프로그램을 작성하였다.

 

 

하지만 기계어로 제어하는 만큼 한자리라도 잘못되면 원하는 결과가 안나올수 있다.

 

오늘 처럼 원인을 잘못 생각해서 삽질하는일 없도록 조심하자 ㅠㅠ

 

아래의 파일은 위 바이너리 이미지 파일

 

helloos.img
1.41MB

 

 

 

 

 

bochs에서도 잘돌아간다!

300x250
728x90

자료에서보면

 

boshs에 방금 만든 이미지를 돌리더라

 

바로 돌릴수 있는줄 알고 해봤지만

 

- 부팅가능한 이미지가 아니라고 아무것도 뜨지 않는다.

 

 

 

 

다시 잘보니 toolset으로 부팅 가능 이미지로 만들어야 된다고 한다.

 

toolset이 원래 CD에 있다고는 하는데 나는 CD가없으므로

 

소스 찾다보니 깃헙에 올라온걸 찾았다.

 

https://github.com/HariboteOS/tolsrc

 

일단 윈도우 바이너리로 빌드하긴 해야되니

 

mingw부터 깔고, 환경변수 등록하고

 

 

 

toolset 빌드 중

 

하다가 에러발생

 

gmtime_r 이 인클루드 안된것 같다.

 

 

 

찾아보니 ctime.h는 g++에 있는듯 하다

 

 

g++도 설치

 

 

 

으악 보다보니

 

 

c++이 아니라

 

내가 사용한 gcc랑 c언어 표준 이랑 맞지 않았던것 같다.

 

 

C Standards. C표준. C11, C99, C90, 등. 그리고 gcc

https://junho85.pe.kr/1026

 

 

 

 

C2X는 C18 다음 표준안인듯 하다.

 

 

 

 

일단 메이크 파일에서

 

-std=gnu2x를 추가해주고 다시 빌드를 해봤다.

 

 

 

 

 

아까 처럼 워닝은 안뜨지만

 

gmtime_r이 없으니 링킹이 안되는건 여전하다.

 

gcc 버전을 바꿔야 될수도 있겠다...

 

 

 

 

 

 

다시 검색하다보니

 

gmtime_r은 gmtime의 안전한 버전으로 susv2에 있다고 한다.

 

gcc에 susv2만 추가할 수 있으면 될것같긴한데 ...

 

 

 

일단 sus는 단일 유닉스 규격 single unix specification

 

 

 

 

도저히 안되서 msys에서 작업하려는데

 

gcc도 못찾고 있더라

 

누가 pacman -S gcc를 치면 된다길래 했더니

 

gcc가 설치된다 ..

 

 

 

 

찾아보니 pacman이 msys에서 패키지 관리 프로그램이라고 한다.

 

 

https://myshare.tistory.com/14

 

 

pacman으로 gcc 설치후 make 해보니

 

빌드 성공 ..

 

지금까지 뭘한걸가 ㅠㅜㅜㅜ

 

 

make install로 바이너리 정리해주고

 

 

윈도우 실행파일로 빌드 완료 ㅎㅎ

 

 

 

 

추가적인 유용한 도구들 설치

- 아직은 gcc만 설치되어있으므로

 

http://blog.tcltk.co.kr/?p=4002

 

 

imgtol을 써야되는데

 

자꾸 cpp0가 없다고 빌드가 안된다.

 

 

 

 

pacman -S mingw-w64-x86_64-yaml-cpp0.3 설치

 

 

 

그래도 안된다..

 

 

 

 

 

 

 

 

 

 

계속 해매다가

 

어느 중국인이 tolset을 깃헙에 올린걸 찾았다..

 

https://github.com/fakefish/OSASK

 

 

결국에는 이짓을 할 필요가 없었어..

 

 

 

 

다시 해서

 

run.bat 파일이랑 아까 만든 이미지 파일을 놓고

 

 

 

 

run.bat을 돌리면

 

qemu가 돌아가는데 부팅불가능한 이미지라고 뜬다.

 

 

 

install.bat도 만들어서 돌려보면...

 

16비트라고 안돌아간다 OTL

 

 

 

 

아까 구한 imgtol 소스에서

 

빌드해야될것 같다..

 

그런데 아까 cpp0가 없다고 빌드가 안됬었는데 

 

 

 

 

 

z_tools에 있던 cpp0를 가져와 써보자..

 

 

 

여전히 cpp0를 못찾는다고 하니

 

일단 cpp0.exe로 고쳐주자

 

./cpp0.exe -v 로 찍어보니

 

엄청 오래된듯 하다

 

메이크 파일을 고치고

 

 

빌드했더니

 

cpp0는 잘 넘어갔는데 이번에는 aska가 문제다..

 

 

 

메이크 파일에서 필요하단건 다 복붙하자

 

그런데 bim2bin3이 안보인다..

 

 

 

일단 찾은것 대로만 메이크파일 고쳐주고 다시 실행해보면..

 

 

역시 잘되다가 bim2bin3이 문제다

 

아쉬운 대로 ztools에 bim2bin.exe로 바꿔서 한번 돌려보면

 

 

역시나 안된다.

 

 

 

실행 파일명만 바꾸고 옵션을 그대로 둔 상태에서 빌드해봤더니

 

성공

드디여 삽질해서

 

imgtol.com를 만들었다.

 

 

실행했더니 포맷 에러 발생

 

 

 

생각해보니 빌드 문제가 아니라 도스 명령을 64비트 운영체제에서 돌리려한게 문제였다.

 

 

검색해보니 기능 추가하면 돌릴수 있다고 하내

 

 

https://www.groovypost.com/howto/enable-16-bit-application-support-windows-10/

근데 난 없음

 

 

 

어쩔수 없이 도스박스에서 돌려보자

 

 

반가운 도스박스

 

 

 

 

 

일단 돌아가기는 하지만

 

없는 install.bat에 없는 a드라이브에다가 이미지를 쓴다고 했으니

 

드라이버 에러가 난다

 

 

 

아까 imtol 폴더에 readme를 봐야할것같은데

 

한글 윈도우라 다깨진다.

 

일단 볼수 있는 부분으로 이해해보면

 

imgtol.com w a: helloos.img는

 

a: 드라이브로 이미지를 올린다고 볼수 있을것같다

 

 

삽질한 결과 문제는 이게아니었다..

300x250
728x90

 

우선 C언어, 어셈블러가 아닌

바이너리 에디터로 시작

 

바이너리 에디터

- 2진수 편집기로 바이너리 실행파일을 수정할수 있음.

- 사용할 프로그램은 bz162

 

 

Bz162.zip
0.05MB

 

 

 

 

BZ162 바이너리 에디터 화면

- 좌측 000000은 메모리 주소

- 중간의 0 ~ F는 000000, 000001, 000002, ..., 00000F 번지에 각각 32비트 값저장

- 우측의 01234..EF는 ASCII코드상 표현

 

 

바이너리 에디터에 입력 예시

- 다음과 같이 문자열들을 입력할때 해당 문자의 아스키코드 16진수 값이 중앙의 번지에 저장되는 모습을 볼 수 있음.

* 문자 'h'는 10진수로 104 -> 16진수로 0x68로 바이너리 에디터의 000000번지에 올바르게 값이 저장됨.

 

 

- 아래는 아스키 코드 테이블 

아스키코드 테이블

 

 

 

hello.img로 저장

300x250

+ Recent posts