并行阶乘计算

2023-12-27

我想编写一个程序,使用并行计算(Open MP 库)来计算整数的阶乘。

显然,下面的程序存在竞争条件。

// Each loop iteration writes a value that a different iteration reads.
#pragma omp parallel for
for (i=2; i < 10; i++)
{
   factorial[i] = i * factorial[i-1];
}

我在某处读到,pow 和阶乘计算根本无法并行完成。那么,这是真的吗?还是可以修改上面的程序(使用 C 语言,使用 OPenMP 库)来并行计算阶乘?


您可以通过运行数组两次来并行执行此操作。第一次计算部分乘积并保存每个线程的总部分乘积。在第二遍中,您将根据前一个线程的总乘积更正每个元素。这类似于如何并行执行累积和(也称为前缀和),只不过它是并行的累积乘积。

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(void) {
    int n = 10;
    int factorial[n];
    factorial[1] = 1;

    int *proda;
    #pragma omp parallel
    {
        int ithread = omp_get_thread_num();
        int nthreads = omp_get_num_threads();
        #pragma omp single
        {
            proda = malloc(nthreads * sizeof *proda);
            proda[0] = 1;
        }
        int prod = 1;
        #pragma omp for schedule(static) nowait
        for (int i=2; i<n; i++) {
            prod *= i;
            factorial[i] = prod;
        }
        proda[ithread+1] = prod;
        #pragma omp barrier
        int offset = 1;
        for(int i=0; i<(ithread+1); i++) offset *= proda[i];
        #pragma omp for schedule(static)
        for(int i=1; i<n; i++) factorial[i] *= offset;
    }
    free(proda);

    for(int i=1; i<n; i++) printf("%d\n", factorial[i]); putchar('\n'); 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行阶乘计算 的相关文章

随机推荐

  • min-sdk 大于以前版本的 android

    我有一个应用程序 它已经在 Play 商店中存在多年了 我刚刚进行了更新 该更新利用了 numberpicker 它的 min sdk 为 11 并且 v4 支持库不满足该需求 我倾向于发布我的新版本并在清单中将 min sdk 设置为 1
  • 当枚举无法序列化时,提前失败或明确抛出

    在 WCF 服务返回具有无效值 枚举类型中不存在 int 的枚举成员的 DataContract 的情况下 客户端抛出的异常为The underlying connection was closed The connection was c
  • 在Python中解析SQL查询

    我需要在 python 中构建一个迷你 sql 引擎 所以我需要一个 sql parser 并且我发现了 python sqlparse 但无法理解如何从 SQL 查询中提取列名或表名等 有人可以帮我解决这个问题吗 让我们检查 python
  • 数据框的视觉结构:NA 的位置等等

    我想用颜色编码在单个图上表示数据框 或矩阵 或 data table 等 的结构 我想这对于许多处理各种类型数据的人来说非常有用 可以一目了然地将其可视化 也许有人已经开发了一个包来做到这一点 但我找不到一个 只是this https st
  • Android单行TextView不带点

    是否可以有单线TextView在最近的像素处切断并且不添加三个点
  • 如何停止在 WPF DataVisualization 图表中的 Y 轴上显示小数点

    我正在使用 WPF DataVisualization 图表控件来显示一些示例数据 我的问题是 Y 轴显示小数值 我怎样才能让它只显示整数值 这是我的 XAML 代码
  • Excel计算公式错误

    我的VBA代码是 Function yEval entry As String yEval Evaluate entry Application Volatile End Function 在 Sheet1 的单元格 f4 中我有公式 yE
  • 余弦距离作为 k 均值的向量距离函数

    我有一个 N 个顶点的图 其中每个顶点代表一个地方 我还有向量 每个用户一个 N 个系数中的每一个 其中系数的值是在相应地点花费的持续时间 以秒为单位 如果没有访问该地点则为 0 例如 对于图表 向量 v1 100 50 0 30 0 意味
  • 如何通过 Dialog Flow (API.AI) 获取用户从 Facebook Messenger bot 发送的图像/附件?

    我有由 Dialogflow API AI 提供支持的聊天机器人 它要求用户发送图像 我知道 当用户单击 Messenger 中的 开始 按钮时 同时开始与机器人对话 将触发带有 WELCOME FACEBOOK WELCOME 事件的对话
  • 如何从多索引数据框中删除级别?

    例如 我有 In 1 df pd DataFrame 8 9 index pd MultiIndex from tuples 1 1 1 1 3 2 columns A In 2 df Out 2 A 1 1 1 8 3 2 9 有没有比这
  • [表视图重新加载数据];直到我滚动 tableView 才起作用

    我有一个简单的应用程序 当用户键入时 它会下载 XML 格式的搜索结果UISearchBar 下载 解析是线程化的 一旦完成就会触发NSNotification告诉带有表视图的 ViewController tableView reload
  • 如何使用 ng-model 显示输入元素的不同值?

    在控制器中 如果有一个变量用于跟踪分页表页面的索引 从 0 开始 var page pageNumber 0 问题 我怎样才能显示这个pageNumberhtml 中的变量 但总是增加 1 因为index 0页面显然是第一页 因此应该显示为
  • 使用 Laravel 验证来验证 UUID

    是否有一种内置方法可以使用验证规则来验证 UUID 我在 可用的验证规则 https laravel com docs 5 5 validation available validation rules 文档 实际上 Laravel 5 7
  • 奇怪的 git 案例 - git stash 后跟 git stash apply 丢失了未提交的数据?

    我有一个文件 假设 file txt 我已经完成了 git mv file txt 到 file1 txt 然后我创建了一个名为 file txt 的新文件并对其进行了处理 不幸的是我还没有将该文件添加到 git 中 不管怎样 问题是我做了
  • 如何确定矩形的内半径?

    第一张图片是以下代码的结果 一个具有预期半径的矩形 但我需要一个在右上角有内半径的矩形 就像第二个图像一样
  • Font Awesome 未出现在浏览器中

    我正在为我的项目开发一个网站 我正在使用 Bootstrap 和 Font Awesome 作为字形 但我遇到了一个问题 当我使用 Font Awesome 图标时 某些图标不会显示在浏览器中 但某些图标会显示 例如 fa fa user
  • Open GL ES 3.1 计算着色器的最小工作示例

    我想使用 Open GL ES 进行通用计算 所以到目前为止我所理解的是 我需要创建一个 SSBO 并将数据传输到那里 将缓冲区绑定到着色器中的特殊点 运行着色器并取回数据 到目前为止我有3个问题 该代码无法编译 错误 未定义对 glDis
  • 如何在使用 JSch SFTP 库时解析 Java UnknownHostKey?

    我正在运行一个 java 程序 使用 Java SFTP 将文件从一个文件夹传输到另一个文件夹 我遇到的问题是我在 Java SFTP 使用 JSch 中收到以下错误 C Oracle Middleware Oracle Home orac
  • iOS 4 后台模式下的 NSTimer 或 NSThread

    当我的 iPhone 应用程序进入后台模式时 我必须保留 NSThread 或 NSTimer 是否可以 我已在 info plist 中启用后台模式并打开 readstream 和 writestream 如下 我正在使用 UDP CFR
  • 并行阶乘计算

    我想编写一个程序 使用并行计算 Open MP 库 来计算整数的阶乘 显然 下面的程序存在竞争条件 Each loop iteration writes a value that a different iteration reads pr