gpt4 book ai didi

缩放线程运行时的 C++ 并发问题

转载 作者:行者123 更新时间:2023-11-28 05:22:59 25 4
gpt4 key购买 nike

我有一个程序可以对大型数组执行相同的功能。我将数组分成相等的 block 并将它们传递给线程。目前线程执行功能并返回它们应该返回的内容,但是我添加的线程越多,每个线程运行的时间就越长。这完全否定了并发的目的。我尝试使用 std::threadstd::async 都得到相同的结果。在下图中,所有子线程和主线程处理的数据量大小相同(主线程多 6 个点),但是主线程在 ~ 12 秒内运行,子线程占用 ~12 x 线程数,就好像他们异步运行。但它们都是同时启动的,如果我从每个线程输出它们并发运行。这与他们的加入方式有关吗?我已经尝试了我能想到的一切,非常感谢任何帮助/建议!在示例代码中,main 在子线程完成之前不会运行该函数,如果我在 main 运行之后放置连接,它在子线程完成之前仍然不会运行。下面您可以看到使用 3 个和 5 个线程运行时的运行时间。这些时间是在缩小的数据集上进行测试。

void foo(char* arg1, long arg2, std::promise<std::vector<std::vector<std::vector<std::vector<std::vector<long>>>>>> & ftrV) {
std::vector<std::vector<std::vector<std::vector<std::vector<long>>>>> Grid;

// does stuff....
// fills in "Grid"

ftrV.set_value(Grid);
}


int main(){

int thnmb = 3; // # of threads
std::vector<long> buffers; // fill in buffers
std::vector<char*> pointers; //fill in pointers

std::vector<std::promise<std::vector<std::vector<std::vector<std::vector<std::vector<long>>>>>>> PV(thnmb); // vector of promise grids
std::vector<std::future<std::vector<std::vector<std::vector<std::vector<std::vector<long>>>>>>> FV(thnmb); // vector of futures grids
std::vector<std::thread> th(thnmb); // vector of threads
std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<long>>>>>> vt1(thnmb); // vector to store thread grids

for (int i = 0; i < thnmb; i++) {

th[i] = std::thread(&foo, pointers[i], buffers[i], std::ref(PV[i]));
}
for (int i = 0; i < thnmb; i++) {
FV[i] = PV[i].get_future();
}

for (int i = 0; i < thnmb; i++) {
vt1[i] = FV[i].get();
}

for (int i = 0; i < thnmb; i++) {
th[i].join();
}

// main performs same function as foo here

// combine data
// do other stuff..

return(0);
}

run with

run with 3 threads

最佳答案

如果不知道 foo 的作用,很难给出明确的答案,但您可能会遇到内存访问问题。每次访问您的 5 维数组都需要 5 次内存查找,并且只需要 2 或 3 个具有内存访问权限的线程即可达到典型系统所能提供的饱和度。

main 应该在创建线程之后但在获取 promise 的值之前执行它的 foo 工作。

foo 应该以 ftrV.set_value(std::move(Grid)) 结尾,这样就不必创建该数组的拷贝。

关于缩放线程运行时的 C++ 并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081234/

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