x*******r 发帖数: 6 | 1 我的程序是fortran(77/90),程序中需要对一个很大的数组(size=1024*1024*1024)进
行排序(实际我只是要找到the Mth largest的那个数相应的数值).
我手边有Numerical Recipe的一些排序的子程序可用,我尝试用了其中的select.f(
select the Mth largest).当我的array size不是很大时(512*512*512),结果很正确
,但是数组大到size=1024*1024*1024结果就不对了。
请问:有什么排序的子程序可以给这个大尺寸的数组排序?
或者,如果有fortran mpi并行的排序程序也可以。
非常非常感谢您的指点! |
t****t 发帖数: 6806 | 2 什么类型的数据?什么系统?什么编译器?
有一个问题是要注意的,就是1024*1024*1024正好是1G,如果算上数据类型,可能会超过
4G.所以首先你必须用64位的系统,其次64位系统的整数仍然是32位,所以有可能这个会
是问题.我对fortran不太了解,所以不能帮忙.
【在 x*******r 的大作中提到】 : 我的程序是fortran(77/90),程序中需要对一个很大的数组(size=1024*1024*1024)进 : 行排序(实际我只是要找到the Mth largest的那个数相应的数值). : 我手边有Numerical Recipe的一些排序的子程序可用,我尝试用了其中的select.f( : select the Mth largest).当我的array size不是很大时(512*512*512),结果很正确 : ,但是数组大到size=1024*1024*1024结果就不对了。 : 请问:有什么排序的子程序可以给这个大尺寸的数组排序? : 或者,如果有fortran mpi并行的排序程序也可以。 : 非常非常感谢您的指点!
|
k****f 发帖数: 3794 | 3 第n个大小的算法不需要排序的。看看stl的nth_element怎么实现吧
一般是线性复杂度的算法。
【在 x*******r 的大作中提到】 : 我的程序是fortran(77/90),程序中需要对一个很大的数组(size=1024*1024*1024)进 : 行排序(实际我只是要找到the Mth largest的那个数相应的数值). : 我手边有Numerical Recipe的一些排序的子程序可用,我尝试用了其中的select.f( : select the Mth largest).当我的array size不是很大时(512*512*512),结果很正确 : ,但是数组大到size=1024*1024*1024结果就不对了。 : 请问:有什么排序的子程序可以给这个大尺寸的数组排序? : 或者,如果有fortran mpi并行的排序程序也可以。 : 非常非常感谢您的指点!
|
x*******r 发帖数: 6 | 4 数据类型:REAL (single precision)
我的程序是MPI fortran90,用的机器是IBM p690
编译:mpxlf90 (Fortran MPI Compiler),我在编译选项里加了-q64(Enables 64 bit
compilation)
程序里sorting这部分实际上还是串行程序,我把整个数据都集中到一个processor(每
个processor是8G内存)上来算。
再请教一个问题:我是个编程新手,一直不太明白64位/32位的系统的含义,像您说的
“64位系统的整数仍然是32位”,我就不太明白是什么意思?
以前搜索过,看到有人提到32位系统无法对2G以上寻址,所以像我处理的这种4G的就需
要64位。我就生愣愣的在我原先的编译命令上加了一个-q64。但是,我很想知道如果用
64位编译,我的程序需要做什么相应的变化吗?还有,这个32位/64位和精度有什么关
系吗?
再次感谢!
【在 t****t 的大作中提到】 : 什么类型的数据?什么系统?什么编译器? : 有一个问题是要注意的,就是1024*1024*1024正好是1G,如果算上数据类型,可能会超过 : 4G.所以首先你必须用64位的系统,其次64位系统的整数仍然是32位,所以有可能这个会 : 是问题.我对fortran不太了解,所以不能帮忙.
|
P*****f 发帖数: 2272 | 5 目前64位系统中的标准是LP64,即:
int:32bit
long:64bit
pointer:64bit
数据类型:REAL (single precision)
我的程序是MPI fortran90,用的机器是IBM p690
编译:mpxlf90 (Fortran MPI Compiler),我在编译选项里加了-q64(Enables 64 bit
compilation)
程序里sorting这部分实际上还是串行程序,我把整个数据都集中到一个processor(每
个processor是8G内存)上来算。
再请教一个问题:我是个编程新手,一直不太明白64位/32位的系统的含义,像您说的
“64位系统的整数仍然是32位”,我就不太明白是什么意思?
以前搜索过,看到有人提到32位系统无法对2G以上寻址,所以像我处理的这种4G的就需
要64位。我就生愣愣的在我原先的编译命令上加了一个-q64。但是,我很想知道如果用
64位编译,我的程序需要做什么相应的变化吗?还有,这个32位/64位和精度有什么关
系吗?
再次感谢!
【在 x*******r 的大作中提到】 : 数据类型:REAL (single precision) : 我的程序是MPI fortran90,用的机器是IBM p690 : 编译:mpxlf90 (Fortran MPI Compiler),我在编译选项里加了-q64(Enables 64 bit : compilation) : 程序里sorting这部分实际上还是串行程序,我把整个数据都集中到一个processor(每 : 个processor是8G内存)上来算。 : 再请教一个问题:我是个编程新手,一直不太明白64位/32位的系统的含义,像您说的 : “64位系统的整数仍然是32位”,我就不太明白是什么意思? : 以前搜索过,看到有人提到32位系统无法对2G以上寻址,所以像我处理的这种4G的就需 : 要64位。我就生愣愣的在我原先的编译命令上加了一个-q64。但是,我很想知道如果用
|
x*******r 发帖数: 6 | 6 谢谢!那么我程序里的变量都是单精度的,在64位系统里运行会有什么问题吗?
【在 P*****f 的大作中提到】 : 目前64位系统中的标准是LP64,即: : int:32bit : long:64bit : pointer:64bit : : 数据类型:REAL (single precision) : 我的程序是MPI fortran90,用的机器是IBM p690 : 编译:mpxlf90 (Fortran MPI Compiler),我在编译选项里加了-q64(Enables 64 bit : compilation) : 程序里sorting这部分实际上还是串行程序,我把整个数据都集中到一个processor(每
|
t****t 发帖数: 6806 | 7 把你sort的子程序贴来看看吧.
【在 x*******r 的大作中提到】 : 数据类型:REAL (single precision) : 我的程序是MPI fortran90,用的机器是IBM p690 : 编译:mpxlf90 (Fortran MPI Compiler),我在编译选项里加了-q64(Enables 64 bit : compilation) : 程序里sorting这部分实际上还是串行程序,我把整个数据都集中到一个processor(每 : 个processor是8G内存)上来算。 : 再请教一个问题:我是个编程新手,一直不太明白64位/32位的系统的含义,像您说的 : “64位系统的整数仍然是32位”,我就不太明白是什么意思? : 以前搜索过,看到有人提到32位系统无法对2G以上寻址,所以像我处理的这种4G的就需 : 要64位。我就生愣愣的在我原先的编译命令上加了一个-q64。但是,我很想知道如果用
|
x*******r 发帖数: 6 | 8
================================
总共有nx*ny*nz个数,这些数放在变量arr里,变量arr在module FIELD里。我要挑出第
kk大那个数,并把这个值赋给yy.
我编译用的是:mpxlf90_r -qsuffix=f=f90 -q64 -o 。。。。。。
(虽然主程序是MPI的,但是call这个select函数只是在一个processor里,所以这部分
和串行一样)
【在 t****t 的大作中提到】 : 把你sort的子程序贴来看看吧.
|
t****t 发帖数: 6806 | 9 我想不用了,你就把select.f里所有integer改成integer*8就好了.
当然,你自己的主程序里也应该有相同的类型.
【在 t****t 的大作中提到】 : 把你sort的子程序贴来看看吧.
|
t****t 发帖数: 6806 | 10 我google了一下,也找到了这个程序.我没有用过power pc的CPU,但是我想可能是由于编
译器的问题,如果你的array index是32位,那产生的access也是+/-2GB的.你用integer
当index是刚好够,但是*4就不够了.如果你用64位的index,那么access应该是全部64位
的,就没问题了.
所以说你主程序里也要把index改成64位的才好.
【在 x*******r 的大作中提到】 : : ================================ : 总共有nx*ny*nz个数,这些数放在变量arr里,变量arr在module FIELD里。我要挑出第 : kk大那个数,并把这个值赋给yy. : 我编译用的是:mpxlf90_r -qsuffix=f=f90 -q64 -o 。。。。。。 : (虽然主程序是MPI的,但是call这个select函数只是在一个processor里,所以这部分 : 和串行一样)
|
x*******r 发帖数: 6 | 11 非常感谢thrust!
我水平很低,但是大概能明白你的意思。
我是不是只需要将主程序,子程序里相关的整数由integer*4 变为integer*8,而实数
还是Real*4不用变就可以了?
integer
【在 t****t 的大作中提到】 : 我google了一下,也找到了这个程序.我没有用过power pc的CPU,但是我想可能是由于编 : 译器的问题,如果你的array index是32位,那产生的access也是+/-2GB的.你用integer : 当index是刚好够,但是*4就不够了.如果你用64位的index,那么access应该是全部64位 : 的,就没问题了. : 所以说你主程序里也要把index改成64位的才好.
|
t****t 发帖数: 6806 | 12 是这个意思.
【在 x*******r 的大作中提到】 : 非常感谢thrust! : 我水平很低,但是大概能明白你的意思。 : 我是不是只需要将主程序,子程序里相关的整数由integer*4 变为integer*8,而实数 : 还是Real*4不用变就可以了? : : integer
|
x*******r 发帖数: 6 | 13 再次感谢thrust!
等出了结果,我再上来更新。
【在 t****t 的大作中提到】 : 是这个意思.
|
l****n 发帖数: 727 | 14 我也很仰慕thrust....
//狂学习C++中
【在 x*******r 的大作中提到】 : 非常感谢thrust! : 我水平很低,但是大概能明白你的意思。 : 我是不是只需要将主程序,子程序里相关的整数由integer*4 变为integer*8,而实数 : 还是Real*4不用变就可以了? : : integer
|