问题标签 [allocatable-array]
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.
cuda - CUDA-Fortran 设备数据结构中的可分配数组
我正在尝试在驻留在 GPU 内存中的“设备”数据结构中使用可分配数组。代码(粘贴在下面)编译,但给出了段错误。我在做一些明显错误的事情吗?
模块文件称为“gpu_modules.F90”,如下所示:
主程序是'gpu_test.F90',如下所示:
编译命令(来自当前文件夹)是:
终端输出:
任何帮助/见解和解决方案将不胜感激。不,使用指针不是一个可行的选择。
编辑:另一个可能相关的细节:我正在使用 pgfortran 版本 16.10
arrays - (1) 处的可分配数组 '' 必须具有延迟形状或假定等级,并且 (1) 处的 READ 语句中的语法错误错误
我正在尝试读取 ASCII 文件并在编译时遇到错误,例如:
和
我的代码:
我的 ascii 文件中的前 8 列是位置、质量、密度的 x、y、z 分量,以及我正在读入数组的速度的 x、y、z 分量,其中 (1,n), (2, n), (3,n) 分别是 x、y 和 z 分量,n 应该是粒子数。
我做错了什么,如何编译这段代码?
更新:第一个错误已解决,但 READ 语句仍然出现相同的语法错误。
fortran - 可分配的 Intent(inout) 参数可以是可选的吗?
我在尝试定义一个子例程时遇到问题,该子例程的参数包含一个可分配的、可选的、意图(inout)变量,如下所示。代码编译正常,但出现“分段错误 - 无效内存引用”的运行时错误。
子程序 test_routine.f90
该子例程封装在一个模块中,并在 Main 中调用。
模块 test_module.f90
主要测试_main.f90
然后我尝试分配另一个变量op_B,以弥补B,如果主程序没有传入它,它实际上并不存在。但是下面的代码仍然不起作用。
顺便说一句,我也尝试过使用固定大小的数组,但仍然没有帮助。我想知道是否不可能做这样的事情?
arrays - 检查数组是否可在 fortran 中分配
allocated
在 fortran 中,可以使用以下语句检查是否分配了可分配数组:
但是,是否也可以以某种方式检查常规数组是否被声明为可分配的?以下代码
抛出错误
也许存在另一种查询数组性质的语句或方法?
performance - OpenMP 和 Fortran 的 Threadprivate 可分配性能问题
我有一个代码的并行部分,它使用派生类型的 THREADPRIVATE ALLOCATABLE 数组,该数组又包含其他 ALLOCATABLE 变量:
每个线程使用变量“priv”作为大量计算的缓冲区,然后将其复制到共享变量上。
我在一台有两个 CPU 的机器上运行这段代码,每个 CPU 有 10 个内核,当超过 10 个线程的限制时,我遇到了很大的性能损失:基本上,代码线性扩展到 10 个线程,然后在这个障碍之后,坡度大大降低。我在一台有 8 个 CPU 的机器上获得了非常相似的行为,每个 CPU 有 4 个内核,但这次损失大约是 5/6 个线程。
由于 priv 的数量级“n”很小(小于 10),而每个“foo”的“dim”大约是几百万。
我从这种行为中猜想,由于 CPU 之间的连接,访问内存存在某种瓶颈。奇怪的行为是,如果我分别测量执行 HEAVYSTUFF 和 COPYSTUFFONSHARED 所需的时间,那么 HEAVYSTUFF 会减慢速度,而 COPYSTUFFONSHARED 具有“几乎线性”的加速。
问题是:我确定 THREADPRIVATE 派生类型中的内存实际上会在线程所属的 CPU 上本地分配吗?如果是这样,还有什么可以解释这种行为?否则,我该如何强制数据本地化?
谢谢
fortran - ABAQUS 子程序中的“ALLOCATABLE 或 POINTER 属性指示延迟形状数组”
代码:
给出错误信息:
从这段代码中,我需要制作静态变量han
,但会出现错误 #6646。
我需要做什么?
function - Fortran 函数返回未分配的数组导致分段错误
我正在为一些 MPI 分散/收集例程使用一些现代 Fortran 包装器。我试图有一个包装器接口,它在输入上只有一个数组,并在输出上返回 MPI 操作的结果,对于几个派生类型,执行如下操作:
我正在使用返回allocatable
数组的函数来执行此操作。gcc 6.2.0
但是,gcc 7.1.0
每当我返回未分配的结果时,我都会遇到分段错误。
我需要未分配结果的原因是有时我只需要在指定的 CPU 上收集整个数组,所以我不想在所有其他节点上浪费内存:接收节点返回一个带有数据的已分配数组,并且所有其他节点都会收到一个空且已释放的数组。
这是重现该问题的示例代码:
分段错误发生在分配行,即:
你们以前有过同样的问题吗?或者,我是否违反了标准中的任何内容?我不明白为什么应该强制返回可分配数组的函数分配返回值。intent(out)
这和在子程序中有一个虚拟变量不一样吗?
pointers - 通过类型/种类/等级以外的方式区分 Fortran 中的泛型
我大量使用非1
索引ALLOCATABLE
数组,我希望知道它们的实际下限(以及上限),因为它们被赋予为IN
/ INOUT
args 的过程(所以我将这些虚拟参数声明为延迟形状数组以制作它们与它们的界限一起传递;参见f_deferred_all
示例代码)。
但。
有时这些过程(在数据声明部分之后)可以处理作为子数组的实际参数,所以当需要时,我通常最终制作一个过程的副本,更改其参数声明及其名称(参见过程f_assumed
)。最好通过INTERFACE
. 但是标准说我不能,因为
特定过程或绑定的接口通过其参数的固定属性来区分,特别是类型、种类类型参数、等级以及虚拟参数是否具有 POINTER 或 ALLOCATABLE 属性。
在下面的示例程序中,我通过使用指针实参和伪参数克服了这个“限制”(请参阅 参考资料f_deferred_ptr
)。
- 这个“解决方案”是否以某种方式被弃用、不鼓励、危险或其他什么?我问这个是因为我真的没有
POINTER
这么多地使用 s 。
此外,我定义了一个pntr
函数,该函数将 a 返回POINTER
到它的唯一(非ALLOCATABLE
数组或数组的一部分)IN
put 参数,这样我就可以“内联”使用它而无需POINTER
在主程序中定义 a 并且我没有将TARGET
属性放在实际参数上。
- 我是否通过使用
pntr
创建了一个临时数组?我认为是的,但我不确定POINTER
在主程序中定义和关联它是否会在这方面产生影响。 - 是否有可能/是否计划/更改标准以允许在仿制药之间进行这种区分是否有意义?如果这些建议有意义,在哪里发布这些建议?
这里的例子如下。
arrays - Fortran 运行时错误:可分配数组的文件结尾
我正在为一个类做作业,我们需要编写一个程序,使用可分配数组来保存任意数量的 x 和 y 数据对,相应地分配数组的范围,然后计算它产生的线的相关系数. 我到目前为止是这样的:
它编译得很好(使用 fortran 90 和 gfortran),我创建了一个名为 xyfile.dat 的测试文件来试用它,但我收到了以下错误消息:
我错过了什么?我的假文件有 20 行 xy 对,最后有一个输入(我认为这是一个建议),它是一个与其他代码一起使用的文件,所以我不确定发生了什么。请记住,我对此非常陌生,所以显而易见的事情对我来说可能并不明显。任何帮助表示赞赏!
另外,有点不相关,我不确定我是否需要计算斜率或截距,但是我的一个帮助我的朋友说根据作业信息将其放入,所以如果不是,我们暂时忽略它导致错误。:)