2010-05-22 1 views
3

효율적으로 병렬 처리 할 수있는 매우 프로세서 집약적 인 작업이 있다고 가정 해 봅니다. 모두 또는 거의 모든 작업을 수행 할 수있는 프로세서 수는입니다.모든 프로세서 전력을 작업에 전용

작업은 여러 가지 일 수 있으며 기록 된 숫자를 저장하는 반복 피보나치 숫자 생성은 하나의 예일뿐입니다.

+0

어디에서? I/O는이 경우 엄청난 병목 현상이 될 수 있습니다. 숫자를 계산하는 것이 더 좋을 수도 있고 더 간단 할 수도 있습니다. 그런 다음 스레드를 생성하여 해당 번호를 파일에 기록하십시오. 한편, 그 스레드는 다음 번호를 계산하고 쓰기 스레드가 다음 번호에 대한 준비가되었음을 알리기를 기다립니다. 숫자를 계산하는 것은 파일에 쓰는 데 걸리는 시간이 훨씬 적어 지므로 여러 스레드가 하나의 스레드에서 대기중인 여러 숫자를 계산할 필요가 없습니다. – GManNickG

답변

3

대상 환경에 대한 세부 정보가 너무 적었을 수 있습니다.

일반적으로 RTOS를 사용할 때 인터럽트를 비활성화하여 스케줄러 나 인터럽트 서비스 루틴이 실행되지 않거나 스케줄러가 실행되지 않도록 작업 잠금을 적용 할 수 있지만 ISR은 계속 실행됩니다. 작업의 우선 순위를 가장 높은 우선 순위로 올리면 작업 잠금과 동일한 효과를 얻을 수 있습니다.

RTOS (또는 OS 없음)를 사용하지 않는 경우 대개 예약 일정을 관리하지 않지만 스레드가 항복하지 않고 실행되는 경우 (즉, 스레드가 대기하도록하는 함수를 호출하는 경우) 및 다른 스레드 그리고 프로세스가 많은 사이클을 필요로하지 않는다면, 쓰레드는 거의 모든 CPU를 얻게 될 것입니다. 예를 들어 Windows에서 사용중인 루프는 다른 프로세서 집약적 인 작업을 실행하지 않는 경우 대부분의 경우 작업 모니터에서 한 코어의 100 % 사용으로 표시됩니다. 프로세서에 여러 개의 코어가있는 경우 모든 코어를 사용하도록 작업을 병렬 처리해야합니다.

I/O 호출은 일반적으로 스레드 차단을 일으키므로 결과를 '저장'해야하므로 문제가 발생할 수 있습니다. 해결책은 결과를 메모리에 직접 또는 큐 또는 쓰기 캐시로 버퍼링하고 모든 계산이 완료 될 때까지 출력을 지연하는 것입니다.

+0

예, 우선 순위를 높이고 인터럽트를 비활성화하는 것이 좋습니다. 그것을 위해 +1! 하지만 최대 CPU 사용률을 얻기 위해 여러 코어의 경우 하나의 작업을 병렬 처리 할 수 ​​있습니까? –

+0

@ S.Man : 그것에 대해 확실하지 않습니다. 특정 언어 지원이 필요합니다. 헨델 C는 문장 수준에서 병렬화를 지원하지만 이는 FPGA 프로그래밍을위한 것이다. 구성 및 검증이 어려우며 프로세서에서 비효율적 일 수 있습니다. 그렇다면 컴파일러가 아닌 병렬화 된 것을 결정해야하는 프로그래머 일지라도 컴파일러는 순차적으로 무엇이 종속적인지, 그렇지 않은지를 결정할 수 없습니다. 핸들 C에서이 기능은 다중 사이클 프로세스의 사이클마다 결과를 생성하는 파이프 라인을 구현하는 데 사용됩니다. http://en.wikipedia.org/wiki/Handel-C – Clifford

0

운영 체제가 CPU 헌정을 처리합니다. 대부분의 경우, 프로그램이 더 많은 전력을 필요로한다면 얻게 될 것이지만 우선 순위가 높은 (Linux의 경우 "nice") 프로세스는 CPU 시간 요청 대기열에서 더 높을 것입니다.

0

글쎄, 주로 프로젝트의 컨텍스트와 프로세서에서 실행중인 다른 태스크에 따라 다릅니다. , SPI 또는 당신이 무엇이든, 당신이 상관 할 수있는 몇 가지 우선 순위가 낮은 작업이,의는 USB에 통신으로 가정 해 봅시다

1/프로세서는 을하고있다 :

두 가지 예를 고려 예를 들어, 통신 계층이이 작업의 출력을 대기하기 때문에 계산 중 (프로세스 집중적 인 작업). 그런 다음 운영 체제에 따라 정적 또는 동적으로이 작업에 매우 높은 우선 순위을 할당 할 수 있습니다.

2/프로세서가 수행중인 우선 순위가 높은 작업, 심지어 작은 것 (감시, 규정, 측정)이므로 다른 작업을 중지 할 수 있습니다 (메시지, 작업 일시 중지 ...) 잔여 마이크로 프로세서 전원이 필요하므로 작업을 에보다 낮은 우선 순위으로 할당 할 수 있습니다.

그래서 태스크에 우선 순위를 지정하는 방법에 대해 궁금한 점이 있을지 모르겠지만, 모든 것은 펌웨어 아키텍처와 운영 체제 또는 큰 '메인'사이의 선택에 달려 있습니다!

정확한 답변이 필요한 경우 더 자세히 알려주세요.

0

불필요한 프로세스를 모두 제거하십시오.

이 프로세스 또는 다른 프로세스로 인해 발생한 모든 디스크 액세스 및 기타 차단 IO를 해제합니다. 이 작업을 수행해야하는 경우 늦게 처리하고 배치하십시오. 병렬 스레드에서 여러 코어를 사용하고 CPU 간 프로세스 또는 코어 간 프로세스 친 화성을 설정하면 도움이 될 수 있습니다. 마지막 프로세스는 OS 고유 일 것입니다.

프로세스를 높은 우선 순위로 설정하여 더 큰 공유를 얻습니다.