[合集]求助关于大数组

在Linux 64位环境下,使用PGI的pgf90编译器,讨论了如何处理超过2GB的大数组。讨论中提到了在C中使用malloc容易实现,但在Fortran中需要特定方法。尽管PGI的f90不支持超过2GB的动态分配,但可以通过静态分配或使用特定编译选项解决。讨论中提到了64位寻址的限制和 Opteron 处理器的内存管理。最后,有人分享了成功分配3.4G数组的Fortran代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发信人: leavy (☆星河☆), 信区: Fortran
标 题: [合集]求助关于大数组
发信站: 南京大学小百合站 (Tue Sep 7 21:38:48 2004)

vapour2004 (vapour) 于Thu Sep 2 13:04:04 2004)
提到:

在Linux86-64下,用pig5.2-2的pgf90怎样实现超过2GB的大数组呢?
在pgcc下就容易,只要include stdlib.h 并用malloc就可以来.
fortran怎么办呢?
着急中.......
先谢了

leavy (☆星河☆) 于Thu Sep 2 13:20:48 2004)
提到:

我也遇到过这样的困难,一个数组1G多就开不了,后来在程序里分割很麻烦
研究一下pgi说明书,可能会有办法


tsy (tsy) 于Thu Sep 2 16:32:29 2004)
提到:

这么大的玩意我还从来没有碰到过
估计也碰不到了hoho
为什么不用c来开,然后用fortran调用呢?



tsy (tsy) 于Thu Sep 2 16:52:01 2004)
提到:

记得曾经在那里见过这么个说法:
机器配置都是512M内存,虚拟内存1G(windows),交换区512M(linux)
其它的什么就忘记啦,好象是p4 1.7吧~~
1、windows中
用f90,数组是allocatable的,整型和real*4只能达到256M(61*1024*1024),双精度只

达到31*1024*1024,如果再大的话,虽然编译不出错,但是会显示和虚拟内存有关的错误
,即使你的虚拟内存再大也没有用;静态数组可以开到1.6G左右,但是编译会给警告,但
是结果是正确的,好象windows下vfp程序只能够用256m内存
2、linux中
动态数组可以开到708M再大就出错,对于静态数组只能够使用真实的内存空间,交换区的
用不上。

不过是不是就不知道了,我还没有用过那么大的所以就没有去尝试过啦



vapour2004 (vapour) 于Thu Sep 2 17:52:36 2004)
提到:

首先我使用的机器是 2 x opteron246 内存为16GB,所以不要再讨论交换空间的问题
其次我以前自己写程序总是用C, fortran掌握不好, 现在一定要用fortran,
不为别的, 就是想熟练fortran。
在c中当然好弄, 当然如果不include stdlib.h, 用动态内存malloc
编译也通过, 小数组运行时也没问题, 但就是不能大于2GB(注意单位)。
我想在fortran中会不会有类似的情况,我现在就是想用fortran的动态内存分配malloc,

我想一定有一个什么头文件或库里面能有突破2GB限制的,
只是pgi的书明书里没有清楚提到,但用pgi确实可以不用动态内存分配直接申请2GB以上的
数组,
但是这样的程序我不满意,如果fortran连这么重要而简单的问题都解决不了,我看
就干脆死掉算了。因为fortran一直就是以数值计算著称的,在量子力学计算中波函数数组

经常会很大,我最近的任务中就是有这样的计算,总内存量大约12GB,其中有一个
数组就是8GB左右,这次用了fortran我就是想用到底,谁也别劝我用什么其它的法子了。

还有我知道opteron用的是40或48的寻址,这个问题也不用讨论了。



leavy (☆星河☆) 于Thu Sep 2 18:05:43 2004)
提到:

opteron应该内存没限制吧?有没有unlimit?编译能够顺利通过吧?
我当时用的是2G内存的P4微机,
单个数组好像不能超过900M左右(可能偏差大点,具体不详)


leavy (☆星河☆) 于Thu Sep 2 18:07:08 2004)
提到:

我在Linux下单个静态数组也不能超过900M左右,总内存2G


leavy (☆星河☆) 于Thu Sep 2 18:10:08 2004)
提到:

你是用那些选项编译的?前段时间我们这有台opteron测试用的,可惜我没试试大内存
推荐再到高性能计算HPC版去问问,那儿很多大牛:P


yogicy (我踏月色而来) 于Thu Sep 2 18:19:51 2004)
提到:

64位的不应该出现2G的限制,即使是静态分配的,也应该是足够的。




leavy (☆星河☆) 于Thu Sep 2 18:35:14 2004)
提到:

我记得在sgi上要unlimit的,编译时也要加 -64


yogicy (我踏月色而来) 于Thu Sep 2 18:53:48 2004)
提到:

对,用64编译。

不过好像静态的大数组在opteron上用pgf90 64编译也通不过,不知为何。但如果用动态分配是可以的。



vapour2004 (vapour) 于Fri Sep 3 08:05:40 2004)
提到:

原来在pgi的f90中malloc或allocate不支持2GB以上数组(见官方maillist),
没办法用分割数组并行解决了了事。
谢谢大家的讨论。
关于c中的数组问题,我提一句,每次返回的指针都是40位的,40位以上的统统为nil。

所以amd64在suse9.1pro-PGI环境下,不是真正的64位机(主要指寻址),
即使官方公布技术细节也指说寻址为48位,
话又说回来了,其实世界上一直也没出现过真正的64位机。

在这里有个建议,来此提问的都是应该自己努力解决过问题的,
所以类似人云亦云的讨论不应该出现,比如编译参数等等手册说得很清楚的问题,
还有,没有实际经验,并且功底不是很扎实的,不应该说出64位应该没有2GB限制等结论,

因为程序的运行不仅与硬件有关还与操作系统编程环境是密切相关的。

关于limit的问题,每个程序员在linux环境下编程之前,都应该直接用limit命令查看的,

以便做必要的修改。

我说这些话绝对是善意的,只是希望本版更具可读性。
再次感谢各位热心的大侠。

yogicy (我踏月色而来) 于Fri Sep 3 10:33:19 2004)
提到:

anyway, 我在opteron上allocate了一个3.4G的数组



leavy (☆星河☆) 于Fri Sep 3 11:44:31 2004)
提到:

我没真正用过opteron,以前有机会的测试时候没想到测试大内存


vapour2004 (vapour) 于Sat Sep 4 06:19:16 2004)
提到:

我很想知道您是怎样申请到大数组的?
是pgi5.x么?
能否告知,哪些头文件,具体实例。
非常感谢!!!!

yogicy (我踏月色而来) 于Sat Sep 4 13:04:12 2004)
提到:

fortran中不需要什么头文件。用的是5.2,但好像只要不是太低的版本就可以了,可以去
pgi的网站上查查。

另外不知道你的操作系统是不是64位的。

以下是测试的程序:

program biggg
implicit none

parameter(n=15000)
complex*16, allocatable :: a(:,:)
integer i,j,n


allocate(a(n,n))
do i=1,n
do j=1,n
a(i,j)=cmplx(i,j)
enddo
enddo
pause
deallocate(a)

end



vapour2004 (vapour) 于Sun Sep 5 07:02:36 2004)
提到:

真的很奇怪用allocate就可以
我一直以为malloc和allocate在对内存操作上没什么大区别,在c中就没看出什么差别。

万分感谢yogicy
如果有空能不能讲讲这两个函数在f中除了返回参数之外的区别呢?主要是对物理内存的操
作上。
再次感谢



Carrot (大萝卜1号) 于Sun Sep 5 09:43:49 2004)
提到:

你的os能访问多少内存?
在一个充满奇妙代码的虚拟世界中,有一位著名的代码探险家 LYET。某天,他在古老的代码遗迹中发现了一段复杂的代码文档 A,文档中描述了许多函数 B,以及这些函数的详细声明 B ′ 。更令人兴奋的是,LYET 还找到了一段神秘的代码片段 C,据说找到与之相关的函数能解开代码遗迹的终极秘密。 然而,探险过程并不容易!LYET 必须确定文档 A 中包含哪些函数 B,而这些函数的声明 B ′ 中还需要包含这段神秘代码片段 C。面对繁琐的手动筛选,聪明的代码探险家 LYET 决定求助于你这位传奇的代码考古专家。 你告诉 LYET:“这太简单了!我们只需要把文档 A 中提到的函数 B,以及声明中包含 C 的函数 B ′ ,找出来匹配一下,就能解决问题!” 为了完成这个任务,你需要编写一个强的字符串解析器,用来解析文档 A、短代码片段 C,以及函数集合 {B n ​ } 和它们的声明 {B n ′ ​ }。这样,你们就能快速找到哪些函数揭示了代码遗迹的秘密! ———— 形式化地来说,你需要找到那些字符串 B 满足以下条件: 文档 A 中包含 B,同时 B 的函数声明 B ′ 中包含代码片段 C。 输入格式: 第一行包含一个正整数 n,表示函数的数量,满足 1≤n≤10 4 。 第二行包含两个字符串 A 和 C,满足 1≤∣A∣,∣C∣≤10 4 。 接下来 n 行,每行包含两个字符串 B 和 B ′ ,满足 1≤∣B∣,∣B ′ ∣≤10 4 。 注意,字符串中仅包含小写字母。 输出格式: 从小到,每一行输出一个整数 i,满足:B i ​ 在文档 A 中,同时函数声明 B i ′ ​ 中包含代码片段 C。 输入样例: 4 abcdefg z abcde zoi abcde oi abpde zoi efg bdz 输出样例: 1 4 样例解释: 对于第 1 组数据,B=abcde,B ′ =zoi,满足 A 中包含 B,且满足 B ′ 中包含 C。 对于第 4 组数据,B=efg,B ′ =bdz,满足 A 中包含 B,且满足 B ′ 中包含 C。 对于第 2 组数据,B=abcde,B ′ =oi,满足 A 中包含 B,但不满足 B ′ 中包含 C。 对于第 3 组数据,B=abpde,B ′ =zoi,不满足 A 中包含 B,满足 B ′ 中包含 C。 代码长度限制 16 KB 时间限制 1500 ms 内存限制 512 MB 栈限制 8192 KB
最新发布
06-17
大数组相乘通常是指对两个非常的一维或多维数组进行逐元素相乘、矩阵乘法或其他形式的运算操作。由于涉及的数据量较,这类计算可能会面临性能瓶颈或内存不足的问题。以下是关于大数组相乘的一些关键点: ### 1. **逐元素相乘** - 如果有两个小相同的数组 `A` 和 `B`,可以将它们对应位置的元素逐一相乘生成新的结果数组 `C`。 ``` C[i] = A[i] * B[i] ``` ### 2. **矩阵乘法** - 对于二维数组(即矩阵),矩阵乘法规则是行向量与列向量之间的内积运算: ``` C[i][j] = ∑(A[i][k] * B[k][j]) ``` 其中,`i` 表示第一个矩阵的行索引,`j` 表示第二个矩阵的列索引。 ### 3. **优化策略** - 当处理数据时,直接暴力循环往往效率低下,因此需要借助高效算法库或并行化技术提升速度。 - 使用 NumPy 等科学计算工具包加速数值运算; - 利用 GPU 并行计算框架如 TensorFlow 或 PyTorch 进行硬件加速; - 将任务分解到分布式系统上完成,比如通过 Spark 的 RDD 数据结构实现分块计算。 ### 示例代码 (Python) 假设我们采用 Python 中的 NumPy 库来进行简单的大数组相乘演示: ```python import numpy as np # 创建两个随机大数组 array_a = np.random.rand(1000, 1000) # 形状为 (1000x1000) 的浮点数矩阵 array_b = np.random.rand(1000, 1000) # 执行逐元素相乘 result_elementwise = array_a * array_b # 执行矩阵乘法 result_matrixmul = np.dot(array_a, array_b) print("逐元素相乘已完成") print("矩阵乘法已成功执行") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值