- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题听起来很基础,但我找不到具体的答案。所以现在假设我们有一个像 corei5 680 这样的多核处理器(2 个物理内核和 HT 为操作系统启用了 4 个可用内核)。我的问题是 openMP 究竟在哪里适合图片?1 - 当我们说使用 openMP 的多线程时,它会自动利用所有可用内核(在本例中为 4 个虚拟内核)并根据可用的 CPU 周期执行线程吗?2 - openmp 是否可以控制如何使用物理/虚拟核心?或者它是抽象的并提供像 java 这样的多线程环境?
如果这听起来很基础,请原谅,但我试图在网上找到答案,但没有找到令人满意的答案。
谢谢
最佳答案
这在一定程度上取决于您正在考虑的 OpenMP 版本/功能,因为我相信更高版本可能会为您提供更多功能,但原始库是围绕 for
原语数据并行构建的。通常,OpenMP 和其他数据并行编程模型会尝试抽象出底层硬件,程序员将其计算声明为对数据的一系列操作,然后由 OMP 进行调度。
要回答您的第一个问题,操作系统调度程序将跨内核调度线程,OMP 调度程序将跨可用线程调度工作。
#pragma omp parallel for
for (i = 0; i < N; i++)
a[i] = 2 * i;
OMP 调度程序将根据多种因素选择使用哪些内核(真实或 HT),包括它们的负载、分配给它的工作量以及您可能提供的任何提示。人们会期望上面的代码在所有可用的核心上运行(在你的例子中是 4 个)
您可以使用 schedule
关键字来控制调度程序如何分配工作。
schedule(type, chunk): This is useful if the work sharing construct is a do-loop or for-loop. The iteration(s) in the work sharing construct are assigned to threads according to the scheduling method defined by this clause. The three types of scheduling are:
static: Here, all the threads are allocated iterations before they execute the loop iterations. The iterations are divided among threads equally by default. However, specifying an integer for the parameter chunk will allocate chunk number of contiguous iterations to a particular thread.
dynamic: Here, some of the iterations are allocated to a smaller number of threads. Once a particular thread finishes its allocated iteration, it returns to get another one from the iterations that are left. The parameter chunk defines the number of contiguous iterations that are allocated to a thread at a time.
guided: A large chunk of contiguous iterations are allocated to each thread dynamically (as above). The chunk size decreases exponentially with each successive allocation to a minimum size specified in the parameter chunk
来自 Wikipedia
回答你的第二个问题。您还可以使用 num_threads
属性来指定要使用的线程数。在示例中的 #pragma omp parallel for
上方添加以下内容会将 OMP 限制为三个线程,无论是否有更多线程可用。
#pragma omp parallel num_threads(3)
#pragma omp for
for (i = 0; i < N; i++)
a[i] = 2 * i;
还可以在某种程度上控制多处理器(多个插槽)系统中不同处理器之间的工作调度方式。 OpenMP and NUMA relation?
您可能还会发现以下指南很有用,Guide into OpenMP: Easy multithreading programming for C++ .
关于multithreading - 使用 openMP 进行多核处理与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634026/
OpenMP 中的高斯消除。我是 openmp 的新手,想知道我是否在正确的地方使用了我的编译指示和屏障。我的 x 值每次都不同。他们应该是一样的吗?? #include int num; doub
给定一个示例函数(示例在下面给出),for 循环可以使用 OpenMP 并行化或使用矢量化进行矢量化(假设编译器执行矢量化)。 示例 void function(float* a, float* b,
OpenMP 中原子和关键之间有什么区别? 我能做到 #pragma omp atomic g_qCount++; 但这和不一样吗 #pragma omp critical g_qCount++; ?
我有一个关于如何在您考虑特定依赖关系图时生成 OpenMP 伪代码的问题。 所以假设我们有这个特定的图表: 解决方案可能是这样的: #pragma omp parallel {
我正在尝试使用 openmp 计算二维矩阵的平均值。这个二维矩阵实际上是一个图像。 我正在对数据进行线程分割。例如,如果我有 N线程比我处理行/N thread0 的行数, 等等。 我的问题是:我可以
我想统计测量与 OpenMP 并行化的程序的性能。我选择在执行并行算法的测试应用程序中编写循环 MAX_EXPERIMENTS次并将时间测量报告到文件中。 问题解决方案似乎比提取外部循环上方的并行编译
我找到了 Intel's performance suggestion on Xeon Phi关于 OpenMP 中的 Collapse 子句。 #pragma omp parallel for co
如何使用 OpenMP 并行化数组移位? 我尝试了一些方法,但在以下示例中没有得到任何准确的结果(该示例旋转 Carteira 对象数组的元素,用于排列算法): void rotaciona(int
我有一系列对几个独立函数的调用。 func1(arg); func2(arg); func3(arg); 我想并行执行它们,而不是串行执行它们。我目前正在使用 #pragma omp parallel
我正在尝试使用 openmp 任务来安排基本 jacobi2d 计算的平铺执行。在 jacobi2d 中,依赖于 A(i,j) 从 A(i, j) A(i-1, j) A(i+1, j) A(i, j
我在 3 天前开始使用 OpenMP。我想知道如何使用#pragma使每个内核运行一个线程。详细信息:- int ncores = omp_get_num_procs();for(i = 0; i <
我有一段代码(它是应用程序的一部分),我正在尝试使用 OpenMP 对其进行优化,正在尝试各种调度策略。就我而言,我注意到 schedule(RUNTIME)条款比其他条款有优势(我没有指定 chun
我有一个数字运算 C/C++ 应用程序。它基本上是不同数据集的主循环。我们可以使用 openmp 和 mpi 访问一个 100 节点的集群。我想加速应用程序,但我是 mpi 和 openmp 的绝对新
在 OpenMP 中使用ompsections时,线程会被分配到sections内的 block ,还是每个线程会被分配到每个section? 当nthreads == 3时: #pragma omp
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
我正在尝试通过将循环的每次迭代作为 OpenMP 部分来并行化 OpenMP 中基于范围的 for 循环。我想这样做: #pragma omp parallel sections { for ( au
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
我想编写一个代码转换器,它采用基于 OpenMP 的并行程序并在集群上运行它。 我该如何解决这个问题?我使用哪些库?如何为此设置小型集群? 我发现很难在 Internet 上找到有关集群计算的好 Ma
我是 OpenMP 的新手。我正在尝试为 for 循环使用多个内核,但出现此编译错误: “错误 C3016:'x':OpenMP 'for' 语句中的索引变量必须具有带符号的整数类型”。 我知道 Op
如果我使用 VS 2010 编译器从 Qt Creator 构建项目,我如何启用 OpenMP(从 Visual Studio 构建时,您只需启用该功能)谢谢 最佳答案 在 .pro 文件中尝试下一步
我是一名优秀的程序员,十分优秀!