N******K 发帖数: 10202 | |
N******K 发帖数: 10202 | 2 希望用过openmp的 和这个对比一下 看看性能有什么区别
【在 N******K 的大作中提到】 : 下载文件 : https://www.dropbox.com/s/e9wt1z0sta9zyjs/Multithreading.zip?dl=0 : 我用了c++11 vs2013 : 如果你用的是gcc什么的 请在CMakeLists.txt里面加上一句话 参考链接 : http://stackoverflow.com/questions/16886591/how-do-i-enable-c11 : 另外抱怨什么C++ template,说没用的,基本都是智商堪忧,请自觉转java
|
w***g 发帖数: 5958 | 3 稍微改动一下后可以在linux/gcc上跑通。
【在 N******K 的大作中提到】 : 下载文件 : https://www.dropbox.com/s/e9wt1z0sta9zyjs/Multithreading.zip?dl=0 : 我用了c++11 vs2013 : 如果你用的是gcc什么的 请在CMakeLists.txt里面加上一句话 参考链接 : http://stackoverflow.com/questions/16886591/how-do-i-enable-c11 : 另外抱怨什么C++ template,说没用的,基本都是智商堪忧,请自觉转java
|
N******K 发帖数: 10202 | 4 和 openmp 比较过么?
【在 w***g 的大作中提到】 : 稍微改动一下后可以在linux/gcc上跑通。
|
w***g 发帖数: 5958 | 5 没比较。你这个跟tbb比较像。实际运行应该没有明显差别。
【在 N******K 的大作中提到】 : 和 openmp 比较过么?
|
S*A 发帖数: 7142 | 6 openmp 我猜和 MPI 一样是用 message passing 的。
你的是用 share memory。这个应该会比 message 快。
我没有实验过所以都是猜的。 |
S*A 发帖数: 7142 | 7 看了一下,感觉把简单的事情搞复杂了。
要读懂程序流要费很多不必要的力气。
我就算用 C 实现一下也比这个要紧凑。
【在 N******K 的大作中提到】 : 下载文件 : https://www.dropbox.com/s/e9wt1z0sta9zyjs/Multithreading.zip?dl=0 : 我用了c++11 vs2013 : 如果你用的是gcc什么的 请在CMakeLists.txt里面加上一句话 参考链接 : http://stackoverflow.com/questions/16886591/how-do-i-enable-c11 : 另外抱怨什么C++ template,说没用的,基本都是智商堪忧,请自觉转java
|
N******K 发帖数: 10202 | 8 你写一个std::thread出来
【在 S*A 的大作中提到】 : 看了一下,感觉把简单的事情搞复杂了。 : 要读懂程序流要费很多不必要的力气。 : 我就算用 C 实现一下也比这个要紧凑。
|
S*A 发帖数: 7142 | 9 我写 std::thread 干吗。
直接调用 pthread 不就完了吗。
C++ 自己是不能不依赖 OS 来实现 thread 的。
所以最后还是要调用 pthread 之类的 OS layer。
我真心没看出你搞那么复杂的一大段代码就是展示
std::thread 强在那里。貌似把简单问题复杂话了。
【在 N******K 的大作中提到】 : 你写一个std::thread出来
|
w***g 发帖数: 5958 | 10 gcc的openmp是shared memory,机制跟natureOK的差不多,就是语法更好,各种控制更
多。
比如要把vector jobs里的每个东西用work函数算一个结果出来放入vector<
Result>里,并且要打印progress,用下面的代码就行
#include
boost::progress_display progress(jobs.size(), cerr);
result.resize(jobs.size());
#pragma omp parallel for
for (unsigned i = 0; i < jobs.size(); ++i) {
work(jobs[i], &results[i]);
#pragma omp critical
++progress;
}
openmp可以通过编译器命令行启动或者禁止。禁止的话就是传统的单线程程序。
用C(包括C with class)写才直接用pthread。就是C++11之前也早就有boost::thread
了。
【在 S*A 的大作中提到】 : openmp 我猜和 MPI 一样是用 message passing 的。 : 你的是用 share memory。这个应该会比 message 快。 : 我没有实验过所以都是猜的。
|
|
|
S*A 发帖数: 7142 | 11
这个至少看上去精悍很多,而且也比较容易突出是那里分出去的。
【在 w***g 的大作中提到】 : gcc的openmp是shared memory,机制跟natureOK的差不多,就是语法更好,各种控制更 : 多。 : 比如要把vector jobs里的每个东西用work函数算一个结果出来放入vector< : Result>里,并且要打印progress,用下面的代码就行 : #include : boost::progress_display progress(jobs.size(), cerr); : result.resize(jobs.size()); : #pragma omp parallel for : for (unsigned i = 0; i < jobs.size(); ++i) { : work(jobs[i], &results[i]);
|
N******K 发帖数: 10202 | 12 这点代码其实一点不复杂
ParallelForLoop 和 ParallelBlock
你看似复杂的东西 是有具体应用的
我用后者于图像滤波并行化等等
前者用于一般的for循环
【在 S*A 的大作中提到】 : 我写 std::thread 干吗。 : 直接调用 pthread 不就完了吗。 : C++ 自己是不能不依赖 OS 来实现 thread 的。 : 所以最后还是要调用 pthread 之类的 OS layer。 : 我真心没看出你搞那么复杂的一大段代码就是展示 : std::thread 强在那里。貌似把简单问题复杂话了。
|
S*A 发帖数: 7142 | 13 不必要的复杂。你自己写的不是很觉得,你要从完全没有
读过你代码的人角度看。楼上那个openmp 的代码就精简
很多。
而且你名字类似,功能细微区别的函数太多。反正回到
基本点上,用 pthread 直接实现一个代码篇幅都要比你
得小。而且看的清楚 thread 都是那里来的哪里结束的。
或者你的这个例子不成功,另外有其他的妙用你没有展示
出来。我觉得看到的是不必要的中间层。
【在 N******K 的大作中提到】 : 这点代码其实一点不复杂 : ParallelForLoop 和 ParallelBlock : 你看似复杂的东西 是有具体应用的 : 我用后者于图像滤波并行化等等 : 前者用于一般的for循环
|
N******K 发帖数: 10202 | 14 完整的应用 显然不能发出来啊 哈哈
std::thread windows linux 通用 这一点你否认不了
【在 S*A 的大作中提到】 : 不必要的复杂。你自己写的不是很觉得,你要从完全没有 : 读过你代码的人角度看。楼上那个openmp 的代码就精简 : 很多。 : 而且你名字类似,功能细微区别的函数太多。反正回到 : 基本点上,用 pthread 直接实现一个代码篇幅都要比你 : 得小。而且看的清楚 thread 都是那里来的哪里结束的。 : 或者你的这个例子不成功,另外有其他的妙用你没有展示 : 出来。我觉得看到的是不必要的中间层。
|
S*A 发帖数: 7142 | 15 如果你一开始就是在一个平台做,没有必要自己搞那么复杂。
楼上的就比你的代码简单而且容易读。
如何通用的处理 thread 之间的 signal?
这种通用的代价就是深入使用两个平台都不好用。
【在 N******K 的大作中提到】 : 完整的应用 显然不能发出来啊 哈哈 : std::thread windows linux 通用 这一点你否认不了
|