我编写了以下程序来比较python与c/fortran的速度.为了获得程序使用的时间,我使用了"time"命令.所有程序计算x x + y y + z*z的平方根,其中x,y,z是浮点数.我使用了根方,因为它是科学计算中最耗时的部分之一,我参与其中.
我得到以下几次:
fortran 0m29.9s //
c 0m20.7s //
python 30m10.8s
Run Code Online (Sandbox Code Playgroud)
根据我做的简单测试,我发现Python不推荐用于科学计算.但可能我的代码效率很低.
您是否认为我可以为这个简单的测试用例提高代码效率?
Fortran语言:
program root_square
implicit none
integer i,j
real x,y,z,r
x=1.0
y=2.0
z=3.0
do j=1,3000
do i=1,1000000
r=sqrt(x*x+y*y+z*z)
enddo
enddo
end program root_square
Run Code Online (Sandbox Code Playgroud)
C:
#include "stdio.h"
#include "math.h"
int main (void)
{
float x=1.0,y=2.0,z=3.0,r;
int i,j;
for(j=0; j<3000; j++){
for(i=0; i<1000000; i++) {
r=sqrt(x*x+y*y+z*z);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
#!/usr/bin/env python
from math import sqrt
x = 1.0
y = 2.0
z …Run Code Online (Sandbox Code Playgroud) 通常我会处理看起来像这样的文件:
0.98 3.45
2.45 3.90
.
.
.
4.56 8.45
Run Code Online (Sandbox Code Playgroud)
比方说100行.我想得到这样的东西:
1 0.98 3.45
2 2.45 3.90
.
.
.
100 4.56 8.45
Run Code Online (Sandbox Code Playgroud)
第一列整数.我通常做的是生成一个只有1,2 ... 100的列文件,然后选择该块并将其粘贴到包含两列的文件中.由于行数几乎总是不同,我的方法似乎非常慢.
你有什么建议吗?
谢谢.
我有一个看起来像这样的fortran代码:
open(2,file=filenm(i),status='unknown')
do j=1,num_lines
do k=1,dime
read(2,*) z(k)
enddo
if( j .ge. 1000 ) then
do k=1,dime
sumz(k)=sumz(k)+z(k)
enddo
nsteps=nsteps+1.0
endif
enddo
close(2)
Run Code Online (Sandbox Code Playgroud)
你可以看到压痕不均匀,我希望有这样的东西:
open(2,file=filenm(i),status='unknown')
do j=1,num_lines
do k=1,dime
read(2,*) z(k)
enddo
if( j .ge. 1000 ) then
do k=1,dime
sumz(k)=sumz(k)+z(k)
enddo
nsteps=nsteps+1.0
endif
enddo
close(2)
Run Code Online (Sandbox Code Playgroud)
我可以逐行修复缩进,但代码有点大.我感谢任何评论.
我有一个看起来像这样的文件:
1 148 1 4
2 333 1 3
3 534 2 3
4 772 g 7
5 921 p 2
Run Code Online (Sandbox Code Playgroud)
我想从第1行到第5行以及从第1列到第7行抽取文本:
1 148 1
2 333 1
3 534 2
4 772 g
5 921 p
Run Code Online (Sandbox Code Playgroud)
我可以从vim命令行那样做吗?如果我输入
:1,5ya a
Run Code Online (Sandbox Code Playgroud)
整行都被记入寄存器"a",我只想要某些列.
谢谢.
我正在学习c/c++中线程的概念。我正在尝试Pthreads Overview中引用的两个向量的点积示例。
我运行了代码的串行版本和线程版本,我发现串行版本比线程版本更快。我想应该是相反的。
我在单个 CPU 上运行。
我在Stackoverflow上看到一篇关于mpi的简单程序的帖子:
在该程序中,用户试图通过使用MPI_BYTE mpi类型而不是MPI_CHAR来广播等于20的char变量长度.
我正在尝试(可能不是很聪明)使用MPI_BYTE类型广泛转换整数变量"n":
call MPI_BCAST(n,1,MPI_BYTE,0,MPI_COMM_WORLD,ierr)
Run Code Online (Sandbox Code Playgroud)
但是当我为不同于root的处理器打印"n"的值时,我得到了一个很大的数字.
我的问题是我什么时候可以使用MPI_BYTE?
我已经读到它依赖于机器架构,但我仍然没有明白这一点.
问候.
有没有办法在vim命令行中使用vim/vi?有时我在vim中编写一个长命令,例如:
:!./script /home/user/pet --flag=1
Run Code Online (Sandbox Code Playgroud)
我想通过"其他"更改例如"user".我通常做的是用右箭头导航命令行,这是耗时的,当我想要去行的开头时甚至更多.我希望有一些类似"0"的东西去那里或w/b用文字移动.或者使用j/k转到下一个/上一个命令.
谢谢.
我在我的混合MPI/OpenMP代码中发现了一个问题,该代码在下面引用的代码中以最简单的形式再现.我每个MPI等级使用2个线程.然后在OpenMP"Section"中使用这两个线程进行多次计算,其中之一是对两个不同的向量A和B进行"mpi_allreduce"调用,其结果存储在W和WW中.问题是,每次运行程序时,我都会得到不同的输出.我的想法是MPI调用是重叠的,并且减少的数组W和WW即使在它们具有不同的名称时也会被组合,但我不确定.如何克服这个问题的任何评论都是受欢迎的.
详细信息:MPI线程级别在代码中初始化为MPI_THREAD_MULTIPLE,但我也尝试过串行和漏斗(具有相同的问题).
我编译代码mpiifort -openmp allreduce_omp_mpi.f90并运行我使用:
export OMP_NUM_THREADS = 2 mpirun -np 3 ./a.out
PROGRAM HELLO
use mpi
use omp_lib
IMPLICIT NONE
INTEGER nthreads, tid
Integer Provided,mpi_err,myid,nproc
CHARACTER(MPI_MAX_PROCESSOR_NAME):: hostname
INTEGER :: nhostchars
integer :: i
real*8 :: A(1000), B(1000), W(1000),WW(1000)
provided=0
!Initialize MPI context
call mpi_init_thread(MPI_THREAD_MULTIPLE,provided,mpi_err)
CALL mpi_comm_rank(mpi_comm_world,myid,mpi_err)
CALL mpi_comm_size(mpi_comm_world,nproc,mpi_err)
CALL mpi_get_processor_name(hostname,nhostchars,mpi_err)
!Initialize arrays
A=1.0
B=2.0
!Check if MPI_THREAD_MULTIPLE is available
if (provided >= MPI_THREAD_MULTIPLE) then
write(6,*) ' mpi_thread_multiple provided',myid
else
write(6,*) ' not mpi_thread_multiple provided',myid
endif
!$OMP PARALLEL PRIVATE(nthreads, tid) …Run Code Online (Sandbox Code Playgroud) 我正在学习如何在 OpenMP/Fortran 中使用 SIMD 指令。我写了简单的代码:
program loop
implicit none
integer :: i,j
real*8 :: x
x = 0.0
do i=1,10000
do j=1,10000000
x = x + 1.0/(1.0*i)
enddo
enddo
print*, x
end program loop
Run Code Online (Sandbox Code Playgroud)
当我编译这段代码并运行它时,我得到:
ifort -O3 -vec-report3 -xhost loop_simd.f90
loop_simd.f90(10): (col. 12) remark: LOOP WAS VECTORIZED
loop_simd.f90(9): (col. 7) remark: loop was not vectorized: not inner loop
time ./a.out
97876060.8355515
real 0m8.940s
user 0m8.937s
sys 0m0.005s
Run Code Online (Sandbox Code Playgroud)
我做了编译器关于“非内循环”的建议,并添加了一个 SIMD collapse(2) 指令:
program loop
implicit none
integer :: i,j
real*8 :: …Run Code Online (Sandbox Code Playgroud) 我有以下场景,两个打开的文件
vim -O2 file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)
我的光标在file1.txt中.我想在file2.txt中选择一些行(比如从第80行到第100行),但不必将光标移动到file2.txt并在那里查看文本.如果可能的话,使用vim的命令行.你有什么建议吗?
谢谢.