4

여러 개의 프로세서에서 실행하고 싶은 난처한 병렬 문제가 있습니다. 나는 boost::thread이 새 스레드를 새로운 프로세서에 자동으로 보내 겠지만 모든 프로세스가 상위 프로세스와 동일한 코어에서 실행되고 있다고 생각했습니다. 각 스레드를 다른 프로세서에서 실행할 수 있습니까? 아니면 MPI와 같은 것이 필요합니까?다중 프로세서 부스트 :: 스레드? 하나의 프로세서에서 실행되는 모든 스레드

의심되는 점은 boost::thread은 단순히 멀티 프로세서 도구가 아니기 때문에 설계되지 않은 무언가를하도록 요구하고 있다는 것입니다.

편집 : 제 질문은 다음과 같습니다. 왜 모든 스레드가 하나의 프로세서에서 실행됩니까? boost::thread을 다른 프로세서에 스레드를 보내는 방법이 있습니까? doWork 매개 변수 i를 사용하여 몇 가지 계산을 수행하고 vals에 결과를 저장,

size_t lim=1000; 
std::deque<int> vals(lim); 
std::deque<boost::thread *> threads; 
int i=0; 
std::deque<int>::iterator it = vals.begin(); 
for (; it!=sigma.end(); it++, i++) { 
    threads.push_back(new boost::thread(doWork, it, i)); 
    while (threads.size() >= maxConcurrentThreads) { 
    threads.front()->join(); 
    delete threads.front(); 
    threads.pop_front(); 
    } 
} 
while(threads.size()) { 
    threads.front()->join(); 
    threads.pop_front(); 
} 

으로이 명확해야한다 :

여기 내 코드의 관련 샘플입니다. 내 생각은 maxConncurrentThreads을 사용 가능한 코어 수와 같게 설정 한 다음 각 스레드가 유휴 상태였던 코어를 사용한다는 것이 었습니다. 난 그냥 boost::thread이 방법으로 작동하도록 만들 수 없다는 것을 확인하기 위해 누군가가 필요합니다.

(I 큐를 사용하는 것보다 동시 스레드의 수를 제한 할 수있는 더 좋은 방법이 있다고 추측에는 요, 그뿐만 아니라 저를 꾸짖어 주시기 바랍니다.) 여기


doWork 기능입니다 :

void doWork(std::deque<int>::iterator it, int i) { 
    int ret=0; 
    int size = 1000; // originally 1000, later changed to 10,000,000 
    for (int j=i; j<i+size; j++) { 
    ret+=j; 
    } 
    *it=ret; 
    return; 
} 

편집 : 마틴 제임스가 제안한 것처럼, 문제가 doWork 기능은 처음에 1000 INT 추가이었다이었다. 이러한 작은 작업으로 인해 스레드를 예약하는 것이 스레드를 실행하는 것보다 오래 걸렸으므로 하나의 프로세서 만 사용되었습니다. 일자리를 더 길게 만드는 것은 (10,000,000 ints를 추가하는 것) 원하는 행동을 산출했다. 요점은 : boost::thread은 기본적으로 다중 코어를 사용하지만 스레드가 스레드를 예약하는 것보다 적게 작동하면 멀티 스레딩의 이점을 볼 수 없습니다.

내 이해를 돕는 모두에게 감사드립니다.

+1

오른쪽 다중 스레드 및 다중 처리는 매우 다른 개념이며 boost :: thread는 이전 개념을 지원합니다. – juanchopanza

+0

나에게 MPI 같은 소리 ... 내 세계에 오신 것을 환영합니다! – Scottymac

+2

MPI와 관련이 없다고 생각합니다. 그는 멀티 프로세서 및 멀티 코어 시스템이라는 단어만을 혼합하고 있습니다. – inf

답변

5

항상 대기열의 첫 번째 스레드에 참여하고 있습니다. 이 스레드가 오랜 시간이 걸리는 경우 스레드가 남아있을 수 있습니다. 당신이 원하는 것은 새 스레드를 한번 시작하는 것입니다. 스레드가 완료되었습니다.

효과적인 동시성 수준이 단 하나만 나타나는 이유를 알 수 없습니다.

doWork 기능을 살펴본 후 처음에는 스레드를 시작하는 것보다 작업량이 적게 드는 것이 거의 없다고 생각합니다. 더 많은 작업 (1000x)으로 실행 해보십시오.

+0

'deque'와'queue'를 혼합 했습니까? – inf

+0

코드는'threads.size()> = maxConcurrentThreads' 인 경우에만 결합을 시작합니다. – megabyte1024

+0

@ megabyte1024 그것은 deque의 첫 번째 스레드가 다른 스레드보다 훨씬 오래 걸리면 다른 모든 스레드는 첫 번째 스레드보다 먼저 완료되고 한 번에 하나만 실행되는 스레드가 첫 번째 스레드이기 때문에 중요하지 않습니다. – inf

관련 문제