0
沒有鎖定關鍵部分的C++並行循環,有用PPL實現的parallel_for循環。主要問題在這裏;當我評論cs.lock()和cs.unlock()時,abc向量值不正確。我正在使用concurrency_vector類型來隨機訪問數組值,但它似乎不起作用。鎖定關鍵部分,它工作但很慢。另外,爲了加快速度,我使用索引來存儲值,而不是使用2D-concurrency_vector。什麼問題,沒有鎖定關鍵部分,我錯過了什麼?在下面的代碼中使用PPL
#include <iostream>
#include <ppl.h>
using namespace concurrency;
using namespace std;
int test_function()
{
critical_section cs;
concurrent_vector<double> abc(300 * 400, 1000);
parallel_for (0, 1000, [ & ](int k) {
for (int y = 0; y < 300; y++) {
for (int x = 0; x < 400; x++) {
/// k is using with some calculations for thr
cs.lock();
if (thr < abc[ 400 * y + x ]) {
abc[ 400 * y + x ] = thr;
}
cs.unlock();
}
}
});
}
感謝您快速回答,我是否正確,if語句導致問題,我們應該保護它? – user2055437 2013-02-16 10:11:56
@ user2055437這似乎是這種情況,除非您的計算中有其他事情可能會破壞它。當然這會很慢 - 鎖定/解鎖速度很慢,你需要做很多事情。最後還會有很多不必要的等待。如果您使用粒度鎖定,則可能會看到一些性能改進(創建300 * 400臨界區域,abc的每個元素都有一個,然後使用這些區域進行鎖定)。 – Cubic 2013-02-16 10:15:14
我很抱歉偷你的時間,你可以給一些代碼塊的例子或示例網站,我可以讀最後你說加快的書嗎? – user2055437 2013-02-16 10:21:27