OpenMP 中可重用的私有动态分配数组

2023-12-29

我正在使用 OpenMP 和 MPI 来并行化 c 中的一些矩阵运算。一些对矩阵进行操作的函数是用 Fortran 编写的。 Fortran 函数需要传入一个缓冲区数组,该数组仅在函数内部使用。目前,我正在每个并行部分中分配缓冲区,类似于下面的代码。

int i = 0;
int n = 1024; // Actually this is read from command line
double **a = createNbyNMat(n);
#pragma omp parallel
{
    double *buf;
    buf = malloc(sizeof(double)*n);
#pragma omp for
    for (i=0; i < n; i++)
    {
        fortranFunc1_(a[i], &n, buf);
    }
    free(z);
}

// Serial code and moving data around in the matrix a using MPI

#pragma omp parallel
{
    double *buf;
    buf = malloc(sizeof(double)*n);
#pragma omp for
    for (i=0; i < n; i++)
    {
        fortranFunc2_(a[i], &n, buf);
    }
    free(z);
}

// and repeat a few more times.

我知道可以使用类似于下面代码的方法来避免重新分配缓冲区,但我很好奇 OpenMP 中是否有更简单的方法或某些内置功能来处理此问题。无论我们正在编译的系统上是否存在 OpenMP,如果能够在没有大量编译器指令的情况下编译代码,那就太好了。

double **buf;
buf = malloc(sizeof(double*) * num_openmp_threads);
int i = 0;
for (i = 0; i < num_openmp_threads; ++i)
{
    buf[i] = malloc(sizeof(double) * n);
}

// skip ahead

#pragma omp for
for (i=0; i < n; i++)
{
    fortranFunc1_(a[i], &n, buf[current_thread_num]);
}

可以使用线程私有变量来做到这一点。这些在后续的过程中仍然存在parallel地区:

void func(...)
{
   static double *buf;
   #pragma omp threadprivate(buf)

   #pragma omp parallel num_threads(nth)
   {
       buf = malloc(n * sizeof(double));
       ...
   }

   #pragma omp parallel num_threads(nth)
   {
       // Access buf here - it is still allocated
   }

   #pragma omp parallel num_threads(nth)
   {
       // Free the memory in the last parallel region
       free(buf);
   }
}

这里有几个关键点需要注意。一、分配的线程数buf应与释放它的线程数相匹配。此外,如果中间有平行区域并且他们与更大的团队一起执行,buf可能不会分配到所有这些中。因此,建议禁用 OpenMP 的动态团队规模功能或仅使用num_threads如上所示的子句来固定每个并行区域的线程数。

其次,局部变量只有在静态时才能成为线程私有的。因此,该方法不适合在递归函数中使用。

即使禁用 OpenMP 支持,代码也应该按预期编译和工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMP 中可重用的私有动态分配数组 的相关文章

  • URL 的正则表达式

    我已经编写了正则表达式来验证 URL 它可以是这样的 example com www example com http www example com http www example com https www example com h
  • 在c中用以下结构填充矩阵

    我有以下结构 typedef struct arr integer int size int arr arr arr integer arr arr integer alloc arr integer int len arr arr int
  • .Net Core 中 String 默认不可序列化吗?

    我正在查看其他的 Fortify 静态分析安全测试 SAST 扫描报告 以识别和抑制误报 应用程序框架是C NET Core SAST 报告部分内容如下 Method1 在第 111 行将不可序列化的对象存储为 HttpSessionSta
  • 如何使用 saxon 将文档类型参数传递给 xslt?

    对于发送原子数据类型将使用类似 transformer SetParameter new QName customXml new XdmAtomicValue true 如何将 XML Node 作为参数从 C 传递给 XSLT 你能帮我么
  • C++ 中的字符串到 LPCWSTR

    我正在尝试从字符串转换为 LPCWSTR 我使用多位 1 例如 LPCWSTR ToLPCWSTR string text LPCWSTR sw LPCWSTR text c str return sw 2 返回中文字符 LPCWSTR T
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 我需要一个树转储选项,该选项在当前的 gcc 版本中不再存在

    旧版本的 GCC 例如 4 0 2 或 4 1 2 有该选项 df see 用于调试程序或 GCC 的选项对于4 1 2 http gcc gnu org onlinedocs gcc 4 1 2 gcc Debugging Options
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • 如何从c++调用python

    我是Python新手 我尝试像这样从 C 调用 python 脚本 在 Raspberry Pi 中 std string pythonCommand python Callee py a b int res system pythonCo
  • 接口中的私有成员

    是否可以在 NET 接口中创建私有成员 我听说现在可以了 但我的 IDE 拒绝了 public interface IAnimal void SetDefaultName string name ChangeName name privat
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • g++4.9 不支持 std::align

    在学习对齐问题等时 我意识到我的 g 4 9 macports OS X 实现不支持std align 如果我尝试编译 使用 std c 11 此示例代码来自http www cplusplus com reference memory a
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐

  • Chrome 自动播放政策中的自动播放背景视频

    因此 在最新的 chrome 中 显然自动播放策略已更改 因此这反过来又破坏了每个具有应自动播放视频背景的网站 我想知道是否有人有任何聪明的解决办法可以 解决 这个问题 我相信按钮或 进入页面 解决方案将是一种糟糕的解决方法 特别是对于背景
  • 如何获取函数内部创建的变量?

    我正在 node js 中执行 javascript 文件 并且需要访问在该文件中创建的所有变量 由于这些 javascript 文件可以根据开发人员上下文保存任何内容 因此我需要以编程方式访问变量 我的问题是 如何获取函数内创建的变量 像
  • 创建登录屏幕

    制作密码 登录屏幕的最佳方法是什么 我在某处读到最好使用弹出控件 如果是这样 我到底需要在 App xaml 中的哪里创建它 在为 Windows Phone 7 应用程序实现登录屏幕时 您需要考虑许多事项 这是一个示例 http baba
  • 通过 HTTP 访问 FTP?

    我们有一个外部安全 FTP 服务器 我们希望通过 HTTPS 访问该服务器 我们的基础设施不支持 FTP 我知道这是可能的 但我不知道怎么做 我正在寻找这样的东西 ftp ftp mozilla org pub mozilla org zz
  • 如何在浏览器控制台中查看 CORS 飞行前 OPTIONS 请求?

    我正在寻找一种在发出 CORS 请求时查看 CORS 飞行前选项请求的方法 我想查看服务器的响应标头以帮助我调试遇到的 CORS 问题 但我无法在 Chrome 或 Firefox 的 网络 选项卡或控制台中找到执行此操作的方法 我还安装了
  • Azure AD:如何获取令牌中的组信息?

    我们在 MEAN 堆栈中开发了应用程序 我们正在使用阿达尔角 https github com AzureAD azure activedirectory library for js用于天蓝色广告身份验证的库 根据文档和样本 https
  • MarginLayoutParams.setMargins() 不起作用?

    事情是这样的 我想以编程方式添加一些图像 图像应该有一个topMargin of 5dip除了第一张图片之外 LinearLayout with a vertical orientation方式 代码段下方 LinearLayout bod
  • 使用各种语言在 Hadoop 中运行作业的优缺点是什么?

    到目前为止 我一直使用 Pig 或 Java 进行 MapReduce 专门针对 Hadoop 集群运行作业 我最近尝试通过 Hadoop 流使用 Python Map Reduce 这也很酷 所有这些对我来说都有意义 但我对何时想要使用一
  • 如何将 numpy 对象数组转换为 str/unicode 数组?

    Update 在最新版本的 numpy 例如 v1 8 1 中 这不再是问题 这里提到的所有方法现在都可以按预期工作 原问题 使用对象数据类型来存储字符串数组有时很方便 特别是当需要修改大型数组的内容而不事先知道字符串的最大长度时 例如 g
  • JQuery live 或与 .change() 类似的东西?

    我想做这个 http docs jquery com Events live typefn http docs jquery com Events live typefn 只有 live 不支持更改事件 有解决方法吗 需要将函数绑定到某些动
  • 设计问题 - Web 应用程序会话中的持久数据

    我正在使用 servlet 和 jsp 开发一个 Web 应用程序 我有一个关于存储登录会话中多个 servlet 需要使用的数据的问题 例如 当用户登录时 我从数据库获取用户对象 并希望将其存储在某个地方 并让后续的 servlet 和
  • 使用构面时如何将值向量传递给 geom_vline?

    我有一个包含多列的数据框 每列对应一个不同的 id 我使用以下代码为每列创建了密度图 ggplot melt df aes x value geom density facet wrap paginate variable nrow 3 n
  • Python、Pandas 删除 Excel 中的行

    用于删除某些行的电子表格 在保存到新电子表格之前 将删除其第一列中包含以 36 开头的值的所有行 我使用这些代码 并且需要随后在 Excel 中拆分列 该示例如下所示 import xlwt from xlrd import open wo
  • Rails:has_many,但也有不同名称的 has_one

    让我们说一个User有很多Documents 以及单个Document他们目前正在努力 我如何在 Rails 中表示这一点 我想说current user current document Document first 在文档前面有或没有
  • sessionStorage 未按预期工作

    这是我的代码 sessionStorage loggedIn true if sessionStorage loggedIn alert true else alert false 够简单的 关于 JavaScript 如何评估这些表达式
  • UITextField成为FirstResponder仅工作一次

    在我的应用程序中 用户可以输入自己的姓名 UITextField 将被添加到视图中 并调用BecomeFirstResponder 在textFieldShouldReturn方法中 调用了resignFirstResponder 然后在
  • 使用线性内核调整 SVM 时,R 插入符异常缓慢

    在调整 SVM 参数时 我观察到一个非常奇怪的行为caret 当训练单个模型而不进行调整时 具有径向基核的 SVM 比具有线性核的 SVM 花费更多时间 这是预期的 然而 当在相同的惩罚网格上调整具有两个核的 SVM 时 具有线性核的 SV
  • 在 Centos 7 上安装 Node JS 4.8 则安装 6.11

    目前我尝试在我的 Centos 7 64 位机器上安装 Node Js 特定版本 4 8 使用以下命令 curl sL https rpm nodesource com setup 4 x bash yum install y nodejs
  • 正则表达式替换指令中的 html 标签

    我正在使用 Angular JS 来获取和ng repeat通过 Twitter 推文 我需要突出显示推文字符串的某些部分 例如 tag and hash 所以建议我使用replace在我想要突出显示的内容周围添加 DOM 包装器 问题是
  • OpenMP 中可重用的私有动态分配数组

    我正在使用 OpenMP 和 MPI 来并行化 c 中的一些矩阵运算 一些对矩阵进行操作的函数是用 Fortran 编写的 Fortran 函数需要传入一个缓冲区数组 该数组仅在函数内部使用 目前 我正在每个并行部分中分配缓冲区 类似于下面