gpt4 book ai didi

使用 PPL 不锁定临界区的 C++ 并行循环

转载 作者:行者123 更新时间:2023-11-28 03:23:04 25 4
gpt4 key购买 nike

在下面的代码中,有一个用 PPL 实现的 parallel_for 循环。主要问题就在这里;当我评论 cs.lock() 和 cs.unlock() 时,abc vector 值不正确。我正在使用 concurrency_vector 类型来随机访问数组值,但它似乎不起作用。锁定关键部分,它正在运行但速度很慢。此外,为了加快速度,我使用索引来存储值,而不是使用 2D-concurrency_vector。问题是什么,没有锁定关键部分,我错过了什么?

#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();
}
}
} );
}

最佳答案

为什么您希望它起作用?如果这在没有锁定的情况下并行运行,abc[400*y+x] 可以并且将会在 if 语句和赋值之间更改,从而破坏您的逻辑。 vector 类型本身是线程安全的与此无关。

关于使用 PPL 不锁定临界区的 C++ 并行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com