问题标签 [openmp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - 您使用哪些并行编程 API?
考虑到当今多核和多处理硬件的巨大重要性,试图了解人们目前实际上是如何编写并行代码的。对我来说,主要的范式似乎是 pthreads(POSIX 线程),它在 Linux 上是原生的,在 Windows 上可用。HPC 人倾向于使用 OpenMP 或 MPI,但在 StackOverflow 上似乎没有很多。还是您依赖 Java 线程、Windows 线程 API 等而不是可移植标准?在您看来,进行并行编程的推荐方法是什么?
或者您是否在使用更奇特的东西,例如 Erlang、CUDA、RapidMind、CodePlay、Oz,甚至亲爱的老 Occam?
澄清:我正在寻找非常便携且适用于各种主机架构上的平台(例如 Linux、各种 unix)的解决方案。Windows 是一种极少的支持很好的案例。所以 C# 和 .net 在这里真的太狭窄了,CLR 是一项很酷的技术,但他们能否为 Linux 主机发布它,以便它像 JVM、Python、Erlang 或任何其他可移植语言一样普遍。
C++ 或基于 JVM:可能是 C++,因为 JVM 倾向于隐藏性能。
MPI:我同意即使是 HPC 人员也认为它是一个难以使用的工具——但对于在 128000 个处理器上运行,它是解决 map/reduce 不适用的问题的唯一可扩展解决方案。不过,消息传递非常优雅,因为它是唯一一种似乎可以很好地扩展到本地内存/AMP、共享内存/SMP、分布式运行时环境的编程风格。
一个有趣的新竞争者是MCAPI。但我认为还没有人有时间对此进行任何实践经验。
所以总的来说,情况似乎是有很多我不知道的有趣的微软项目,而 Windows API 或 pthreads 是实践中最常见的实现。
stack - 使用 OMP 的分段错误
全部!来自意大利的打字 如果矩阵大小小于 800 并且因分段错误而失败,则此小段代码有效。似乎问题出在堆栈大小......我该如何增加它?如何解决更大矩阵尺寸的问题?代码在串行放置中运行良好,在并行执行中失败。谢谢。
import - OpenMP:foo() 和 bar() 有什么区别
Q1- foo() 和 bar() 是等价的吗?
c++ - C++ 并行化库:OpenMP 与线程构建块
我将改造我的自定义图形引擎,以便它能够利用多核 CPU。更确切地说,我正在寻找一个库来并行化循环。
在我看来,OpenMP 和英特尔的线程构建块都非常适合这项工作。此外,Visual Studio 的 C++ 编译器和大多数其他流行的编译器都支持两者。这两个库似乎都非常易于使用。
那么,我应该选择哪一个呢?有没有人尝试过这两个库,并且可以给我一些使用这两个库的利弊?另外,你最终选择了与什么合作?
谢谢,
阿德里安
multithreading - 缺少 OpenMP 功能:线程优先级
任何人都可以考虑一下。OpenMP 功能可调整 cpu 肌肉以处理哑铃。在我对 openmp 的研究中,我们无法设置线程优先级来执行具有强大肌肉的块代码。只有一种方法(_beginthreadex 或带有 5 个参数的 CreateThread 函数)来创建具有最高优先级的线程。
这里有一些关于这个问题的代码:
这是手动设置。
这是我想看到这部分:
或者
我不知道是否有办法使用 openmp 设置优先级,请告知我们。
warnings - OpenMp 编码:警告:忽略 #pragma omp parallel
在 Linux 上使用 OpenMP 指令编译 C 代码时收到此警告:
Gcc 版本是 4.4。
这只是我不应该关心的警告吗?执行会并行吗?我想要一个带有一些解释的解决方案。
我已经提供-fopenmp
了make
命令,但 gcc 不接受,否则对于文件的单个编译,即gcc -fopenmp
工作正常。
c++ - 'mpirun' 不被识别为内部或外部命令,
我需要制作一个小型 openMP 项目。我从 www.openmp.org 中获取了示例。我可以在 VC++ 2005 中使用 /openmp 选项对其进行编译。但是,当我尝试运行该程序时,我面临“'mpirun' 未被识别为内部 ort 外部命令、可运行程序或批处理文件”错误。当我在网上搜索时。我发现这个 mpirun 和 mpiexec 不在 XP 桌面上。它们仅在服务器分发中。如何在 Windows 上运行/调试 openMP 程序?
还是我需要去Linux?
c++ - 递归函数上的 OpenMP 并行化
我正在尝试使用并行化来提高绘制具有分层排序对象的 3D 场景的刷新率。场景绘制算法首先递归遍历对象树,并由此构建绘制场景所需的基本数据的有序数组。然后它多次遍历该数组以绘制对象/叠加层等。由于从我所读到的 OpenGL 不是线程安全的 API,我假设数组遍历/绘图代码必须在主线程上完成,但我我在想我可能能够并行化填充数组的递归函数。关键是数组必须按照对象在场景中出现的顺序填充,因此将给定对象与数组索引相关联的所有功能都必须以正确的顺序完成,但是一旦分配了数组索引,我就可以使用工作线程填充该数组元素的数据(这不一定是微不足道的操作)。所以这是我想要得到的伪代码。我希望您了解 xml-ish 线程语法。
那么,是否可以使用 OpenMP 来做到这一点,如果可以,怎么做?是否有其他并行化库可以更好地处理这个问题?
附录:应Davide的要求,让我再详细解释一下。假设场景是这样排序的:
现在,这些对象中的每一个都有很多与之相关的数据,即位置、旋转、大小、不同的绘图参数等。此外,我需要在这个场景上进行多次传递才能正确地绘制它。一个过程绘制对象的形状,另一个过程绘制描述对象的文本,另一个过程绘制对象之间的连接/关联(如果有的话)。无论如何,如果我必须多次访问这些不同的对象,从这些不同的对象中获取所有绘图数据非常慢,所以我决定使用一次将所有数据缓存到一维数组中,然后将所有实际的绘图通过只看数组。问题是,因为我需要以正确的顺序执行 OpenGL 推送/弹出,所以数组必须处于代表树层次结构的正确深度优先搜索顺序。在上面的例子中,
因此,数组的顺序必须正确序列化,但是一旦我正确分配了该顺序,我就可以并行化数组的填充。例如,一旦我将 Bicycle Frame 分配给索引 0 并将 Handle Bars 分配给索引 1,一个线程可以填充 Bicycle Frame 的数组元素,而另一个线程填充 Handle Bars 的数组元素。
好的,我想在澄清这一点时,我已经回答了我自己的问题,所以感谢 Davide。所以我发布了我自己的答案。
visual-c++ - Visual Studio 2005 标准版中的 OpenMP
我使用 OpenMP 和 gcc 来编写并行代码。我现在使用 Visual C++ 2005 并试图弄清楚如何使用 OpenMP。Properties->C/C++/Language 菜单中有一个编译器选项,但它抱怨缺少库。是否有 OpenMP 的第 3 方实现,或者我只是错误地配置了 Visual C++?