openmp 相关问题

OpenMP是一种跨平台的多线程API,它允许使用特殊的编译器指令进行细粒度的任务并行化和同步。

目标和目标数据之间的差异?如何在没有团队指令的情况下进行团队/线程配置?

我有 2 个关于新 OpenMP 4.0 的问题。 第一个是我无法理解目标和目标数据之间有什么区别?根据规范目标数据创建新数据

回答 1 投票 0

扩展这个函数可以并行读取文件吗?

我用 C 语言开发了这个函数来读取每行一个单词组成的文件,就像标准的单词列表一样。 功能已经优化到合理的程度了,但是我想知道是否...

回答 1 投票 0

如何分析由 clang 编译的 OpenMP 卸载代码

我目前正在使用 LLVM/clang-16(从 github 存储库构建)进行 OpenMP 卸载。使用 clang 中的内置分析工具(使用 LIBOMPTARGET_P 等环境变量...

回答 2 投票 0

在for循环中打开mp和chunksize

我正在使用 OpenMP 并行化(内部)循环。 每次迭代的工作量不是很大,因此更多的线程会带来重要的开销。 因此我将循环安排为静态(a...

回答 1 投票 0

一个周末 OpenMP 并行化中的光线追踪

我一直在关注“一个周末的光线追踪”教程系列,这在学习光线追踪方面似乎相对规范。 我一直在尝试使用 OpenMP 加速代码...

回答 1 投票 0

OpenMP 减慢运行时间

我需要帮助并行化这段代码,我知道在循环内使用 !$omp 并行会减慢速度,所以我必须将其放在外部,但这样做会创建错误值 !$omp 并行...

回答 1 投票 0

OpenMP 如何知道嵌套了多少个循环实例?

我很早以前在编写c++程序时就使用过OpenMP。 突然,我的脑海中浮现出一个问题。 “OpenMP 如何知道嵌套了多少个循环实例?” 编译器是否显式计算?

回答 1 投票 0

任务依赖子句中 OpenMP 迭代器的实现

我正在尝试使用任务来调整 C + OpenMP 中块矩阵乘法的代码(示例 5.3.5)。 此代码使用依赖数组部分说明了任务依赖关系。 这是摘录...

回答 1 投票 0

Openmp 递归任务

我是 Openmp 编程新手,我有一个关于递归任务并行性的问题 让我们考虑一下这个演示 C 代码: #包括 #包括 #包括 我是 Openmp 编程新手,我有一个关于递归任务并行性的问题 让我们考虑一下这个演示 C 代码: #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <omp.h> struct timeval t1, t2; void recursive_task(int level) { //printf("%d\n", level); if (level == 0){ usleep(1000); return; } else { recursive_task(level-1); #pragma omp task { recursive_task(level-1); } #pragma omp task { recursive_task(level-1); } #pragma omp taskwait recursive_task(level-1); } } int main() { double time; gettimeofday(&t1, 0); #pragma omp parallel { #pragma omp single { recursive_task(7); } } gettimeofday(&t2, 0); time = (double)((t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec) / 1000000; printf("%.4f\n", time); return 0; } 每一级递归执行 4 次调用,其中只有第二次和第三次调用可以实际并行运行。 现在我尝试了这个不同的版本: #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <omp.h> struct timeval t1, t2; void recursive_task(int level) { //printf("%d\n", level); if (level == 0){ usleep(1000); return; } else { #pragma omp task if(0) { recursive_task(level-1); #pragma omp task { recursive_task(level-1); } recursive_task(level-1); #pragma omp taskwait recursive_task(level-1); } } } int main() { double time; gettimeofday(&t1, 0); #pragma omp parallel { #pragma omp single { recursive_task(7); } } gettimeofday(&t2, 0); time = (double)((t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec) / 1000000; printf("%.4f\n", time); return 0; } 执行似乎也遵循正确的调用顺序(我认为这与 if(0) 子句有关)。 然而令我惊讶的是第二个比第一个更快。我使用 8 个线程执行,第一种方法需要 4.4 秒,第二种方法需要 3.4 秒! 使第二个代码更快的主要区别是什么? 重点是影响#pragma omp taskwait等待当前任务的子任务完成,当有使用#pragma omp task if(0)创建的任务时,当前任务不一样。这意味着“不”拥有较晚的指令会导致“过度同步”,从而导致更高的执行时间(当然是由于并行性较低)。事实上,在这种情况下, #pragma omp taskwait 指令会等待更多任务(尤其是没有 if(0) 的真实任务。 2 个级别的示例 为了更好地理解发生了什么,我们可以分析该函数在级别 2 上到底做了什么(并将延迟增加到 10_000,以便我们可以在运行时看到任何差异)。这是扁平化代码: void recursive_task_level2() { #pragma omp task if(0) { #pragma omp task if(0) { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait usleep(10000); } #pragma omp task // <----- [A] WAITED TASK { #pragma omp task if(0) { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait usleep(10000); } } #pragma omp task if(0) // <----- [B] IMPORTANT ONE { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait // <----- [C] usleep(10000); } #pragma omp taskwait #pragma omp task if(0) { usleep(10000); #pragma omp task usleep(10000); usleep(10000); #pragma omp taskwait usleep(10000); } } } 这个想法是:如果 [B] 存在,那么 [C] 不会等待 [A],因为它不再是子任务;但是,如果 [B] 不存在,则 [C] 等待 [A],即等待 10 毫秒之前。通过在有/没有 [B] 以及有/没有所有其他 #pragma omp task if(0) 的情况下运行此代码来确认此效果。在这种情况下,唯一重要的指令是 [B],而注释 [B] 确实会增加执行时间 10 毫秒(92 毫秒 vs 102 毫秒)。这证明了假设是正确的。随着级别的增加,由于过度同步,并行量会大大减少,并且额外的时间也会在关键路径上累积(当然是指数级的),从而导致巨大的执行开销。

回答 1 投票 0

OpenMP 共享变量似乎是私有的

我不明白为什么在这段代码中只有线程0有n = 1,而其他线程有n = 0并且共享n: int main() { 整数n,tid; #pragma omp 并行共享(n) 私有(tid) { ...

回答 2 投票 0

如何在 OMP - C 中将私有数组合并到共享数组?

我正在尝试并行化一个程序,以使用归约来查找局部最大值。但是,我在合并过程中遇到了一个问题:合并后的数组最终少了两个

回答 1 投票 0

libgomp.so.1:无法打开共享对象文件

我在我的 C++ 代码中使用 OpenMP。 libgomp.so.1 存在于我的 lib 文件夹中。我还将其路径添加到 LD_LIBRARY_PATH 仍然在运行时我收到错误消息:libgomp.so.1:无法打开共享...

回答 1 投票 0

如何使用 OpenMP 在共享内存系统上并行化 Fortran 中的嵌套循环,并将线程显式分配给内部和外部循环?

我正在开发一个带有嵌套循环的 Fortran 程序,我想使用 OpenMP 对其进行并行化。该程序在共享内存多处理器系统上运行,我想要以下内容: 内循环...

回答 1 投票 0

OpenMP 性能问题:并行性没有改善执行时间

我有这个代码; #包括 #包括 #包括 #包括 #定义 NUM_VERTICES 1024 int 距离[NUM_VERTICES]; int 最短路径树[

回答 1 投票 0

OpenMP 并行递归与分支

我正在尝试使用 OpenMP 加快计算速度,但我不确定并行化是否适用于分支。 这是代码(删除了不必要的部分): 如果(标志){ int val;...

回答 1 投票 0

在 Visual Studio 2022 中将 OpenMP 更新到更高版本

在VS22中,OpenMP仍为2.0版本。可以更新到5.0或者至少3.0吗?我还没有在 VS22 安装程序中找到任何允许这样做的选项。

回答 2 投票 0

是否可以以某种方式混合静态和动态循环调度?

我使用的机器有 2 个 Xeon CPU,每个 CPU 16 个核心。有 2 个 NUMA 域,每个 CPU 一个。 我有密集的计算,也使用大量内存,而且一切都是多线程的......

回答 1 投票 0

声波方程传播的实现在两个线程之外根本无法扩展

在下面的 OpenMP C 代码中,我期望使用 tempfield 可以帮助在一个缓存行中写入 p1,在我的例子中是 64 字节。相比之下,使用两个线程我几乎获得了 2 倍的加速...

回答 1 投票 0

我的声波方程传播的 OpenMP 实现在两个线程之外根本无法扩展,这可能是什么问题?

在下面的 OpenMP C 代码中,我期望使用 tempfield 可以帮助在一个缓存行中写入 p1,在我的例子中是 64 字节。相比之下,使用两个线程我几乎获得了 2 倍的加速...

回答 1 投票 0

树中的最高和路径

问题描述: 给定一棵通用树,目标是识别并计算从根到具有最大节点值总和的叶子的路径。树中的每个节点都有一个关联的

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.