여러 개의 프로세서에서 실행하고 싶은 난처한 병렬 문제가 있습니다. 나는 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
은 기본적으로 다중 코어를 사용하지만 스레드가 스레드를 예약하는 것보다 적게 작동하면 멀티 스레딩의 이점을 볼 수 없습니다.
내 이해를 돕는 모두에게 감사드립니다.
오른쪽 다중 스레드 및 다중 처리는 매우 다른 개념이며 boost :: thread는 이전 개념을 지원합니다. – juanchopanza
나에게 MPI 같은 소리 ... 내 세계에 오신 것을 환영합니다! – Scottymac
MPI와 관련이 없다고 생각합니다. 그는 멀티 프로세서 및 멀티 코어 시스템이라는 단어만을 혼합하고 있습니다. – inf