gpt4 book ai didi

c++ - 使用相关数据执行任务级并行

转载 作者:行者123 更新时间:2023-11-28 02:46:21 25 4
gpt4 key购买 nike

我有 visual studio,其中不支持 openMP 3.0(这意味着它没有任务构造)问题是一个线程必须生成多组数据数组,另一个线程必须为每个完成的集合处理该数据数组......是否有任何解决方法而不使用任务?如果我能得到任何帮助,我将不胜感激。代码:

    int id = omp_get_thread_num();
if (id == 0)
{
for (int k = 0; k < n; k++)
{
int f = k * r * c;
for (int i = 0; i < r; i++)
{
int rw = i * c;
for (int j = 0; j < c; j++)
{
p[f + rw + j] = rand() % 65535;
}
}
_sleep(500);
}
}
if (id == 1)
{
_sleep(200);
for (int k = 0; k < n; k++)
{
int f = k * r* c;
cout << "\n" << k;
for (int i = 0; i < r; i++)
{
int rw = i * c;
for (int j = 0; j < c; j++)
{
p[f + rw + j] *= sin(2 * 3.14 * (10.0 / 100.0) * k);
}
}
Mat img(r, c, CV_16UC1, p);
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", img);
waitKey();
}
}
}
system("pause");

这个程序可以运行,但我不知道它是并行运行还是串行运行,或者是否发生任何冗余...

最佳答案

是的,有标准的 C++11 线程,但还需要做一些工作。

线程的使用/代码的基本结构:

我假设您正在 using namespace std; 。此外,您还需要:

#include <thread>
#include <chrono>

诀窍是将您的线程代码放入一个 void 函数中,该函数接受您的线程 ID 以及共享变量(通过引用)作为输入。例如,我将其用于快速可行性测试(您必须微调/调整类型/等等...):

void mytask (int id, int&n, int& r, int& c, double *p)
{
if (id == 0)
{ ... }
if (id == 1)
{ ... }
}

您还必须使用正确的 sleep 功能来代替以前的功能:

    this_thread::sleep_for (std::chrono::milliseconds(500));  //_sleep (500);

然后在您的代码中,您可以在声明和初始化共享变量后启动您的线程:

...
thread t1 (mytask, 0, n, r, c, p ); // create an launch threads
thread t2 (mytask, 1, n, r, c ,p ); //

t1.join(); // wait for t1 to finish
t2.join(); // wait for t2 to finish
...

这是基本概念。它适用于没有 openMP 的 VC2013 express,至少在概念上是这样。

共享数据和同步:

现在您还必须微调并检查两个线程之间是否存在对相同变量的竞争,并且可以使用 or 来序列化访问。

对您的算法的分析表明,第一个线程将随机数放入表中,第二个线程对这些结果应用公式。这假设第一个线程总是在第二个线程使用它们之前计算元素。但是,您不能对线程的调度假设太多。系统可以减慢其中一个甚至卡住其中一个并稍后恢复。

所以这是一个初步的想法(但需要进一步阐述),使用:

#include <atomic>

定义一个共享的 protected 变量来存储外循环计数器(我在这里建议这样做,因为两个线程使用相同的序列访问 p[]):

atomic<int> line_ready=-1;  // U used here a global variable

在生产线程中,在外循环的末尾添加一行:

line_ready.store (k);    // sync: loop was processed from 0 to k. 

在消费线程中,在外层循环的开头添加一行:

while (k>line_ready.load()) // sync: read k to know if we have to wait for data
this_thread::sleep_for (std::chrono::milliseconds(100)); // wait

如果数据不可用,这将等待数据。现在由你决定!

关于c++ - 使用相关数据执行任务级并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24278409/

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