並行for循環我打算使用緩衝器std::vector<size_t> buffer(100)
,一個在每個線程在一個循環的一個並行化,作爲所建議的這樣的代碼:預分配的專用的std :: OpenMP中矢量在C++
std::vector<size_t> buffer(100);
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
// ... code using the buffer ...
}
這代碼不起作用。儘管每個線程都有一個緩衝區,但它們的大小爲0.
如何在每個線程的開始處分配緩衝區?我仍然可以使用#pragma omp parallel for
嗎?我能做到比這更優雅:
std::vector<size_t> buffer;
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
if(buffer.size() != 100) {
#pragma omp critical
buffer.resize(100);
}
// ... code using the buffer ...
}
我想我現在看到了這個問題。該向量未正確複製構建到OpenMP區域中。我不確定OpenMP標準中關於將'private'變量複製到線程中的說法。 – Mysticial 2013-03-11 22:28:44
如果您希望它們分開,只需在OpenMP區域內聲明矢量即可。 – Mysticial 2013-03-11 22:29:43
感謝您的澄清。如果我手動並行化循環,我知道如何去除OpenMP區域內的矢量。但是這也適用於'#pragma omp parallel for'嗎? – 2013-03-11 22:33:23