더 많은 코어를 가진 프로세서를 선택한다는 사실 종종 특정 프로그램을 사용할 때 같은 정도로 성능이 향상되지 않습니다. 이 현상은 왜 발생하며, 그 원인은 무엇입니까? 여러분께 자세히 설명해 드립니다.
시간이 지남에 따라 최신 버전의 프로그램을 사용하는 이유 중 하나는 코어 수가 더 많은 프로세서를 더 잘 활용하도록 설계되었기 때문입니다. 시간이 지남에 따라 CPU에 있는 이들의 수가 증가하고 있음을 잊지 마십시오. 그러나 프로그램에서 성능이 향상되지 않는 이유는 무엇입니까?
프로그램은 코어 수에 따라 확장되지 않습니다.
실행되는 프로그램은 우리의 실행 스레드 수에 따라 주어진 순간에 활성 프로세스 또는 작업을 나눌 수 있는 기능이 없다는 점을 고려하는 것이 중요합니다. CPU. 무엇보다 이 구분이 프로그램 코드에 명시되어 있다는 사실, 즉 프로그래머의 기술과 응용 프로그램 설계의 산물이기 때문입니다.
실제로 프로그램을 코딩할 때 중요한 것은 가능한 한 많은 수의 코어를 사용하기 위해 프로그램을 최적화하는 것이 아니라 대기 시간입니다. 후자를 프로세서가 시간 단위로 측정된 작업을 완료하는 데 걸리는 시간으로 이해합니다. 그리고 CPU의 성능은 가장 짧은 시간에 가장 많은 작업을 완료하는 것으로 구성됩니다. 먼저 아키텍처와 두 번째 클럭 속도에 따라 달라집니다.
그러나 대기 시간과 관련하여 우리가 관심을 갖는 것은 주어진 기간 내에 완료할 수 있는 작업의 수를 아는 것입니다. 이는 워크로드이며 이는 프로그램이 작성된 상황과 방식에 따라 달라집니다. 즉, 성능은 하드웨어뿐만 아니라 소프트웨어가 얼마나 잘 작성되었는지에 따라 달라집니다.
여러 코어의 분업
이제 시스템의 코어 수를 늘리면 작업을 여러 조각으로 나누고 훨씬 쉽게 완료할 수 있습니다. 여기에서 T/N 공식이 등장합니다. 여기서 T는 수행할 작업 수이고 N은 시스템이 실행할 수 있는 실행 스레드 수입니다. 분명히 우리는 소수의 코어에 최대 수의 작업을 로드하고 무차별 대입하여 문제를 해결할 수 있습니다. 문제는 이 조치가 각 코어에서 개별적으로 더 높은 성능을 제공하는 최신 CPU에 도움이 되기 때문에 비생산적이라는 것입니다.
그러나 서로 다른 코어 간에 작업을 나누는 것은 일반적으로 전도체 역할을 하는 코어에 주어지는 추가 작업이며 다음 작업을 수행해야 합니다.
- 프로세스와 작업 목록을 만들고 항상 잘 제어해야 합니다.
- 작업을 완료하고 다른 작업을 시작하는 데 걸리는 시간을 포함하여 작업이 시작되고 끝나는 시간을 항상 예측하는 방법을 알아야 합니다.
- 서로 다른 커널은 프로세스가 언제 시작하고 끝나는지 알기 위해 기본 커널에 신호를 보낼 수 있는 기능이 있어야 합니다.
이 솔루션은 SONY, Toshiba 및 IBM이 PS3의 중앙 프로세서인 Cell Broadband Engine에 채택했으며 마스터 코어가 나머지를 지시했습니다. 훨씬 더 거슬러 올라가지만 Atari Jaguar에 채택되었습니다. PS4의 경우 SONY는 이 모델을 다시 반복하지 않았고 악몽이기 때문에 아무도 PC에 구현하지 않았지만 작업을 분할하는 가장 효율적인 방법입니다.
모든 것이 다중 코어에서 실행될 수 있는 것은 아닙니다.
작업을 하위 작업으로 나누어 더 많은 수의 코어에 무한정 배포할 수 있는지 스스로에게 묻는다면 대답은 '아니오'입니다. 특히 작업을 세 가지 유형으로 분류해야 합니다.
- 완전히 병렬화될 수 있으므로 중앙 프로세서가 가지고 있는 서로 다른 코어 간에 분할될 수 있습니다.
- 부분적으로 병렬로 실행할 수 있는 작업입니다.
- 병렬로 실행할 수 없는 코드 부분.
첫 번째 경우는 T/N이 100% 적용되고, 두 번째 경우는 이미 코어 수 증가에 따른 가속도가 부분적인 이른바 암달의 법칙에 진입했고, 세 번째 경우는 단순히 모든 해당 작업을 위한 단일 코어의 성능,
멀티스레딩에서 CPU와 GPU의 차이점
여기서 우리는 차별점에 도달합니다. GPU 또는 그래픽 칩에는 명령 목록을 읽고 다른 GPU 코어와 다른 장치 간에 명령 목록을 배포하는 제어 장치가 있습니다. 이것은 이전 사례의 하드웨어 수준 구현이며 작업이 있는 한 포화하려는 모든 구성에서 완벽하게 작동하므로 가능한 한 많은 코어를 사용 중인 상태로 유지합니다. 그러나 GPU에서 실행의 개념 스레드는 항상 해당 데이터 및 명령 목록에 해당한다는 것을 이해해야 합니다. 즉, 픽셀, 정점 또는 모든 데이터입니다.
병렬화하기 쉽습니다. 즉, 계란을 튀기고 싶다면 CPU의 프로세스는 계란을 튀기는 것이며 완전히 순차적입니다. 반면에 그래픽 칩에서는 단순히 기름을 데우거나 팬에 계란을 추가하는 작업이 될 것입니다. 이 모든 것이 계란 하나를 튀기는 속도를 높이는 것이 아니라 여러 개를 튀기는 것이므로 GPU는 동시에 수백만 개의 다각형이나 픽셀을 계산하는 것과 같은 작업에는 더 좋지만 순차적인 작업에는 적합하지 않습니다.