CPU의 Multiprocessing ( feat. Python )
참고 : 김진휘
1. Multiprocessing
- CPU의 Multiprocessing
- GPU의 Multiprocessing
2. Python의 Multiprocessing
-
Python의 Multiprocessing은 core 단위가 아닌 thread 단위로 동작한다
-
CPU내에는 여러 개의 core가 존재한다
- core 내에는, logical Processor ( = Thread )가 존재한다
- 일반적으로 core마다 1~2개의 Thread가 존재
일반적으로 (multiprocessing 없이) 코드를 돌리게 되면,
여러 개의 core 중, 하나의 core만이 동작하게 된다.
Multiprocessing은, 여러 개의 core를 사용하는 것을 말한다.
각 core에서 연산된 결과들을, 마지막에 모두 merge하여 반환한다.
( python은 이 부분이 취약하여, 성능이 아주 좋지는 않다 )
3. Code
from multiprocessing import Process
thread=Process(target=함수, args=함수인자)
- 구조 :
thread.start()
~thread.join()
import time,sys
from multiprocessing import Process
def single_core(n):
result=0
for i in range(1,n+1):
result +=i
def multi_core(core_id,num_start,num_end):
result=0
for i in range(num_start,num_end+1):
result +=i
return
def main(arg=None,num_core=8,n=1000):
n = int(n)
num_core = int(num_core)
if arg=="single":
start_time=time.time()
single_core(n)
end_time=time.time()
elif arg=="multi":
tasks = []
start_time=time.time()
for core_id in range(1,num_core+1):
thread = Process(target=multi_core, args=(core_id,(core_id-1)*n//num_core,(core_id)*n//num_core ))
tasks.append(thread)
thread.start()
for task in tasks:
task.join()
end_time=time.time()
else:
print('WRONG ARGUMENT!')
sys.exit()
print(f"Result : {end_time - start_time} sec")
if __name__ == '__main__':
_val = sys.argv
main(_val[1],_val[2],_val[3])
PS C:\Users\LSH\Desktop\advanced_python> python multiprocess_python.py single 8 100000000
Result : 7.964245557785034 sec
PS C:\Users\LSH\Desktop\advanced_python> python multiprocess_python.py multi 8 100000000
Result : 2.237269639968872 sec
1억을 count하는데에 있어서
- single core 사용 시 : 7.96초
- multi(8) core 사용 시 : 2.24초
8개를 사용한다고 해서, 그 성능(속도)가 8배나 좋아지는 것은 아니다.
( 다양한 이유가 있긴 하지만, 대표적으로 core들 끼리 서로 정보 교환하는데에 소요되는 시간 문제도 있다 )
complete parallelism이 아니다!