OpenMP For – 用于缓存优化的组循环
发布时间:2020-12-16 09:48:30 所属栏目:百科 来源:网络整理
导读:我正在努力调整程序以使用OpenMP.我有一组嵌套for循环.最外面的for循环是沿着图像向下的y轴循环.我想在循环中运行多个并行线程,但是我很难快速完成它. 目前,当我运行8个线程时,它运行如下: thread 0 - row 0,8,16...thread 1 - row 1,9,17...thread 2 - row
我正在努力调整程序以使用OpenMP.我有一组嵌套for循环.最外面的for循环是沿着图像向下的y轴循环.我想在循环中运行多个并行线程,但是我很难快速完成它.
目前,当我运行8个线程时,它运行如下: thread 0 -> row 0,8,16... thread 1 -> row 1,9,17... thread 2 -> row 2,10,18... thread 3 -> row 3,11,19... 我希望它以块运行,因此线程0执行前1/8行.做这个的最好方式是什么? 当前代码: ... int y_percent = data_size_Y/8; int thread = 0; #pragma omp parallel for num_threads(8) firstprivate(vecs,bufferedOut,data_size_X,data_size_Y,kern_cent_X,kern_cent_Y,sum) for(int y = y_percent*omp_get_thread_num(); y < (omp_get_thread_num()+1)*y_percent; y++){ // the y coordinate of theoutput location we're focusing on 解决方法
您可以在pragma语句上使用schedule子句来指定希望每个线程处理的块大小.在下面的示例中,我使用块大小指定静态调度方法,该块大小指定每个线程应该获得的连续迭代的数量.在这个简单的例子中,每个线程将获得每个8次迭代的块(例如,线程0将获得迭代0-7,线程1迭代8-15等).值得指出的是,如果您不关心块分布的排序(例如,如果您不关心线程0是否获得第一个块),则可以使用dynamic替换static. dynamic提供了在线程需要时为线程分配块的能力,而不是从一开始就将块预先分配给线程(当某些迭代比其他迭代需要更长的时间时,对于负载平衡非常有用).有关计划方法的更多信息,请查看以下内容:
> Wikipedia article – Scheduling Clauses 例: #include <stdlib.h> #include <stdio.h> #include <omp.h> int main() { int i; int iterations = 32; int num_threads = 4; #pragma omp parallel for schedule(static,8) num_threads(num_threads) for(i=0; i<iterations; i++) { printf("thread %d: %dn",omp_get_thread_num(),i); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 使用Rails Webpacker Jest测试.js.erb文件
- 详解使用vue-admin-template的优化历程
- Swift社交应用文本输入优化汇总
- React 可视化开发工具 shadow-widget 的非可视开发方法
- ruby-on-rails – 自我引用has_many:通过自定义:主键问题
- 使用Playground快速练习Swift语法 --基本语法
- objective-c – MPVolumeView和iOS 5
- c# – 有没有办法将类中的枚举属性设置为所有可用的枚举?
- jruby在rails调度选项
- xml报错 Parse Fatal Error :在实体引用中,实体名称必须紧