我正在修改一些旧的 Fortran 代码以使用 OpenMP 指令运行,并且它大量使用了COMMON块。我发现多个消息来源说使用 OMP 指令将COMMON块声明为通过为每个 OpenMP 线程提供自己的副本THREADPRIVATE来解决COMMON驻留在全局范围内的块的问题。但我不确定的是,该THREADPRIVATE指令是否需要在每个子程序中声明之后,或者是否在主程序中(并且仅)具有它就PROGRAM足够了?
在Matlab R2016a中,我有一大组小X向量和Y向量成对(例如10,000个1x3 X向量与10,000个1x3 Y向量配对).对于每个{X,Y}对,我想为X和Y中的元素的每个成对组合计算2标量参数函数(因此在我的示例中,我将获得10,000个3x3矩阵).
我以为我可以使用bsxfun来执行这些计算,但是当我尝试做一些简单的测试时它不起作用. bsxfun(@(x,y) x*y,[1 2],[1 2]')收益:
ans =
1 2
2 4
Run Code Online (Sandbox Code Playgroud)
这是我期望的.但是,bsxfun(@(x,y) 1,[1 2],[1 2]')退货:
Error using bsxfun
Specified function handle produces invalid output dimensions. The function handle
must be a binary elementwise function.
Run Code Online (Sandbox Code Playgroud)
这毫无意义.函数句柄是一个二元元素函数,它总是返回标量1,所以bsxfun应该给出相同的结果ones(2,2),除非我不理解它是如何bsxfun工作的.
我一直在研究一些已有 30 多年历史的 Fortran 代码,试图找出为什么它会因为看似随机的原因间歇性地不起作用。一组输入适用于一个用户,但不适用于另一个用户,使用 -O1 或 -O3 编译时可以工作的代码,但使用 -O2 时会出现段错误,以及其他奇怪的废话。
经过大约一周的时间挑选了 30 年没有碰过的代码,我找到了问题所在——有很多未初始化的变量,而且这些变量中的随机垃圾是否崩溃基本上是随机的整个计划。老实说,我不知道这段代码是如何工作的。
现在我回到客户那里并告诉他们发生了什么事,他们的回答是“如果这是一个问题,为什么代码在过去 30 年里一直有效......?” 这是一个公平的问题——为什么这个代码在过去 30 年里对他们有效?我想我是从那时起第一个从源代码重建它的人,90 年代的 Fortran 编译器是否将堆栈归零或其他什么?为什么几十年前的程序员认为将变量放在赋值运算符的右侧是合理的,而不考虑这些变量是否已首先初始化?