ベクトルのベクトルのすべての要素を調べるために、次の並列コードを書きました。私は与えられた条件を満たすvector<vector<int> >
の要素だけを保存します。しかし、私の問題は、vector<vector<int> >
内のベクトルのいくつかは非常に大きく、その他はかなり小さいということです。そのため、私のコードはthread.join()を実行するのに時間がかかります。誰かが私のコードのパフォーマンスを向上させる方法についてお勧めしますか?スレッドを結合する際のパフォーマンスの問題
void check_if_condition(vector<int>& a, vector<int>& satisfyingElements)
{
for(vector<int>::iterator i1=a.begin(), l1=a.end(); i1!=l1; ++i1)
if(some_check_condition(*i1))
satisfyingElements.push_back(*i1);
}
void doWork(std::vector<vector<int> >& myVec, std::vector<vector<int> >& results, size_t current, size_t end)
{
end = std::min(end, myVec.size());
int numPassed = 0;
for(; current < end; ++current) {
vector<int> satisfyingElements;
check_if_condition(myVec[current], satisfyingElements);
if(!satisfyingElements.empty()){
results[current] = satisfyingElements;
}
}
}
int main()
{
std::vector<std::vector<int> > myVec(1000000);
std::vector<std::vector<int> > results(myVec.size());
unsigned numparallelThreads = std::thread::hardware_concurrency();
std::vector<std::thread> parallelThreads;
auto blockSize = myVec.size()/numparallelThreads;
for(size_t i = 0; i < numparallelThreads - 1; ++i) {
parallelThreads.emplace_back(doWork, std::ref(myVec), std::ref(results), i * blockSize, (i+1) * blockSize);
}
//also do work in this thread
doWork(myVec, results, (numparallelThreads-1) * blockSize, myVec.size());
for(auto& thread : parallelThreads)
thread.join();
std::vector<int> storage;
storage.reserve(numPassed.load());
auto itRes = results.begin();
auto itmyVec = myVec.begin();
auto endRes = results.end();
for(; itRes != endRes; ++itRes, ++itmyVec) {
if(!(*itRes).empty())
storage.insert(storage.begin(),(*itRes).begin(), (*itRes).end());
}
std::cout << "Done" << std::endl;
}
もっと読みやすい 'itres-> begin()'と言っていない理由は何ですか?そして、 'empty'は関数呼び出しでなければなりません。 –
理由はありませんが、(itRes-> begin())およびif(!(* itRes).empty())の場合と同じ効果があります。 –
明らかに異なる関数を呼び出すので、そうではありません。 –