코드 병렬화에 대해 개념이 없는데 조언좀

yo-tteum의 이미지

요즘 멀티코어 자료를 보고 있습니다.

리눅스는 커널 초기화 단계에서 smp_init() 호출을 통해 코어 정보를 수집해서

나중에 멀티코어 스케줄링에 활용을 하더군요.

응용 레벨에서는 Loop문 정도는 컴파일러 수준에서 옵션에 따라 알아서 병렬화를 해준다고 되어 있네요.

OPENMP 예에서는 #pragma 지시자에 따라 병렬 태스크를 생성할 수도 있고요.

OS입장에서 가지고 있는 코어 정보에 따라 태스크를 할당하는 것은 이해가 됩니다.

그런데 어플을 컴파일러가 병렬화를 해준다는 것은 이해가 안됩니다.

최종 결과물인 바이너리에 병렬화에 대한 정보가 있는 것인가요? 그럼 하드웨어에서 지원하는

병렬화 관련 명령을 컴파일러가 응용을 빌드할 때 삽입해 주는 것인가요. 응용을 빌드하는 컴파일러는

따로 코어 정보를 가지고 있는 것도 아닌데 상황에 따라서 그것이 실제 적용이 되기도 하고 아님 말고

하는 코드를 생성해 낼 수 있을까요.

병렬화를 하는 주체는 하나, OS이거나 컴파일러 이거나 해야 할것 같은데 OS가 태스크를 병렬로 할당하고 있는데

응용은 응용대로 병렬처리를 하려고 하면 OS가 이미 병렬로 할당해 둔 다른 코어의 태스크들은 스케줄링이 어찌

되는 것일까요.

OS는 하나의 코어에서 동작을 하면서 스케줄링이나 기타 작업을 한다고 알고 있는데

OS를 빌드할 때 컴파일러가 최적화로 여기저기 병렬화를 해두면 OS는 자기가 의도하지도 않았는데 여기저기 분산되서 돌게 되는

것인가요?

처음 공부를 시작했을 때는 전부 새로운 내용이라서 그렇구나 했는데, 조금씩 다른 내용과 섞이니까 명확하지 않은 부분때문에 혼

란스럽네요. 아는게 없어서 질문도 이상하게 드린 것 같네요. 읽어주셔서 감사합니다.

chadr의 이미지

openmp의 #pragma 지시자 역할은 단순히 해당 코드 영역을 openmp library를 호출하여 스레드로 따로 빼주는 역할만 합니다.
openmp가 직접 여러 코어에 하나씩 할당해주진 않습니다.

한마디로 스레드를 만들고 지우고 실행하는 코드를 사람이 일일이 짜지 않고 기존 코드에서 크게 변경을 안해도
손쉽게 OS가 병렬화를 하기 쉽도록 해주는 역할입니다.

이렇게 여러 스레드로 분리한 것을 어떻게 효율적으로 물리적인 코어에 할당을 잘 해서 실행해 주는것은 커널 역할입니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

myaid의 이미지

wrong..

myaid의 이미지

double