0

나는 많은 독립적 인 작업을 수행하고 있으며 병렬 시스템으로 배포하여 각 프로세서가 동일한 작업을 수행하고 효율성을 극대화하고 싶습니다.병렬 작업 배포를위한 균등 로딩

이 문제에 대한 해결책을 찾는 일반적인 방법이 있는지, 아니면 정확한 문제에 대한 올바른 해결책이 있는지 알고 싶습니다.

저는 T = 150 개의 작업을 실행하고 각 작업에 걸리는 시간은 t = T입니다. 즉, task1은 1 단위 시간이 걸리고, task2는 2 단위 시간이 걸립니다. task150은 150 단위 시간이 걸립니다. 내가 n = 12 프로세서라고 가정 할 때, 작업을 시작하고 정리하는 데 걸리는 시간은 거의 없다고 가정 할 때 작업 부하를 작업자로 나누는 가장 좋은 방법은 무엇입니까? @ HighPerformanceMark의 독창적 인 접근 방식에 대한 내 최초의 열정에도 불구하고

+0

사용하는 언어는 무엇입니까? – bc004346

+0

이것이 * Bin Packing Problem *이라고 생각합니다. https://en.wikipedia.org/wiki/Bin_packing_problem 아마 가장 긴 직업에서 시작하여 점차적으로 짧은 직업을 시작한다고 생각합니다. 그렇지 않으면 하나만 제외하고 모두 끝낼 수 있습니다. 가장 길다는 것을 발견 할 수 있습니다. –

+0

작업 1과 150을 프로세서 1 (작업 시간은 151 시간)으로 지정하고, 작업 2와 149를 프로세서 2 (작업 시간은 151 시간)에 할당하고, 12 개의 프로세서 각각에서 6 개의 이러한 청크를 얻습니다 6 개의 거의 동일한 작업 (작업 73 - 78)이 종료됩니다. 각 프로세서에 하나씩 부여하십시오. 그것은 진술 된 것과 같이 빈 포장 문제가 아니거나,있는 경우에, 해결하기 아주 쉬운 것이다. –

답변

1

는,이 12 개 코어와 수면의 일초와 함께 작업 한 단위를 시뮬레이션을 사용하는 -j 12와 병렬 GNU를 사용하여 실제로 벤치 마크하기로 결정했다. 로 제안

먼저 나는 작업 목록을 생성 : 다음과 같습니다

paste <(seq 1 72) <(seq 150 -1 79) 

:

다음
1 150 
2 149 
3 148 
... 
... 
71 80 
72 79 

나는 GNU에 목록이 병렬 나머지를 데리러 통과 끝에 6 작업 병렬 :

paste <(seq 1 72) <(seq 150 -1 79) | parallel -k -j 12 --colsep '\t' 'sleep {1} ; sleep {2}' 
sleep 73 & 
sleep 74 & 
sleep 75 & 
sleep 76 & 
sleep 77 & 
sleep 78 & 
wait 

Th 16 분 24 초 만에 뛰었습니다.


그럼 난 당신이 마지막에 어떤 큰 사람과 왼쪽하여 CPU 부하에 불균형을 얻을 수 없을 수도 있습니다, 그래서 그냥 첫 번째 큰 작업을 실행하는 것입니다 내 다소 간단한 접근 방식을 사용 하나의 큰 작업이 필요하기 때문에 실행하고 나머지 CPU는 아무 것도 할 필요가 없습니다.

time parallel -j 12 sleep {} ::: $(seq 150 -1 1) 

그리고 실제로는 15 분 48 초가 걸립니다. 실제로는 더 빠릅니다.


나는 다른 접근 방식에 문제가 작업의 12쌍 첫 6 라운드 후, 6 개 작업이 매우 효율적으로 6 개의 CPU가에 대해 아무것도하지 않고 앉아 78 초 정도 걸립니다있는 가장 긴 남아 있다는 것을 생각 78 초. 작업 수가 CPU 수로 나눠 줄 수 있다면 150은 12로 나눌 수 없습니다.