내 프로그램에서는 큰 데이터 세트를 구문 분석하기 위해 Boost-Spirit-Qi를 사용합니다. 입력 데이터는 순차 레코드입니다. 구문 분석의 효율성을 높이기 위해 TBB를 사용하려고합니다. 다음 병렬 처리하기위한 과정은 다음과 같다 :부울과의 파싱 병렬화 : TBB :: spirit :: qi
typedef map<string, data_struct_t> mdata_t;
vector<string> text;
mdata_t data;
parallel_for(blocked_range<size_t>(0, input.size(), gs),
[&] (blocked_range<size_t>& r) {
data_struct_t cs;
mdata_t cr;
string s;
for(size_t i=r.begin(); i<r.end(); i++) {
s = text[i];
Parser::task1(s, cs);
Parser::task2(s, cs);
Parser::task3(s, cs);
....
Parser::task8(s, cs);
cr.insert(std::make_pair(cs.title, cs));
}
data.insert(cr.begin(), cr.end());
}, ap);
내 프로그램은 CPU (CPU (2), 코어 (16))의 10 %를 사용하고, 코어 (8)에서 작동한다. 나머지 8 코어가 사용되지 않는 이유는 (단일 프로세서) 이해가되지 않습니다. 이 작업을 올바른 알고리즘 병렬 처리로 안내해 주셔서 감사드립니다.
감사합니다.
스탠
많은 분들께 감사드립니다. 몇 가지 의견을 들으면 나는 동의 할 수 없다. 예를 들면 : imput.size = 100000, gs는 1-10000 범위에서 테스트되었으므로 몇 가지 분명한 이유 때문에 작업을 사용하지 마십시오. 컨테이너를 병행 축소 또는 병행하는 데 사용해야 함을 동의합니다. 예제가있는 웹 사이트에 대한 링크를 알고 계십니까? – stansy
@stansy, 방금 생성 한 작업의 범위와 개수가 아닌 경우 동작의 모든 가능성을 다룰려고했는데, 내부 작업량이 적거나 또는 마스크를 통해 제공된 스레드 수에 대한 제한이 있거나 TBB API. 여전히 스레드 수는 위에서 다룬 CPU 사용률과 별개입니다. TBB 패키지 및 참조 페이지에서 예제를 찾을 수 있습니다. – Anton
고마워요 @Anton. 몇 가지 테스트 후에이 문제에 대한 해결책을 찾았습니다. 결론은 간단합니다. 항상 반복자를 인덱스로 사용하지 마십시오. TBB 컨테이너를 사용하여 복잡한 계산을 사용하지 않는 경우 계산 시간이 크게 향상되지 않습니다. 동일한 성공으로 표준 컨테이너를 사용할 수 있습니다. – stansy