我在读取文件,处理其字符串并保存为UTF-8文件时遇到问题.
这是代码:
try:
filehandle = open(filename,"r")
except:
print("Could not open file " + filename)
quit()
text = filehandle.read()
filehandle.close()
Run Code Online (Sandbox Code Playgroud)
然后我对变量文本进行一些处理.
然后
try:
writer = open(output,"w")
except:
print("Could not open file " + output)
quit()
#data = text.decode("iso 8859-15")
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()
Run Code Online (Sandbox Code Playgroud)
这完全输出文件,但根据我的编辑,它在iso 8859-15中这样做.由于同一编辑器将输入文件(在变量文件名中)识别为UTF-8,我不知道为什么会发生这种情况.就我的研究表明,评论的行应该可以解决问题.但是,当我使用这些行时,生成的文件主要是特殊字符的乱码,带有波浪号的文字是西班牙语.因为我难过,我真的很感激任何帮助....
是否有当前的Java MPI实现.我已经在MPI中编程了一下,我喜欢用Java编程.我在Java中看到了这个实现,但似乎过时了.是否有更新的Java实现正在保持?
Donzis&Aditya的一篇论文表明,有可能使用可能在模板上有延迟的有限差分方案.这是什么意思?FD方案可能用于解决热方程和读取(或简化它)
u[t+1,i] = u[t,i] + c (u[t,i-1]-u[t,i+1])
Run Code Online (Sandbox Code Playgroud)
意思是,下一个时间步的值取决于同一位置的值及其前一时间步的邻居.
通过将(在我们的示例中为1D)域分割到不同的处理器上,可以容易地将该问题平行化.但是,在计算处理器的边界节点时我们需要通信,因为该元素u[t,i+-1]
仅在另一个处理器上可用.
问题在下图中说明,该图取自引用的论文.
MPI实现可能使用MPI_Send
和MPI_Recv
进行同步计算.由于计算本身相当容易,因此通信可能成为可能的瓶颈.
该论文给出了该问题的解决方案:
尽管它可能是较早时间步长的值,但只需获取可用的边界音符而不是同步过程.然后该方法仍然收敛(在某些假设下)
对于我的工作,我想实现异步MPI案例(这不是本文的一部分).同步部件使用MPI_Send
并且MPI_Recv
工作正常.我将内存扩展了两个元素作为相邻元素的ghost单元格,并通过发送和接收发送所需的值.下面的代码基本上是上图的实现,并且在计算之前的每个时间步骤期间执行.
MPI_Send(&u[NpP],1,MPI_DOUBLE,RIGHT,rank,MPI_COMM_WORLD);
MPI_Recv(&u[0],1,MPI_DOUBLE,LEFT,LEFT,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
MPI_Send(&u[1],1,MPI_DOUBLE,LEFT,rank,MPI_COMM_WORLD);
MPI_Recv(&u[NpP+1],1,MPI_DOUBLE,RIGHT,RIGHT,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
Run Code Online (Sandbox Code Playgroud)
现在,我绝不是MPI专家.我想,这MPI_Put
可能是我需要的异步情况和阅读一点,我想出了以下实现.
在时间循环之前:
MPI_Win win;
double *boundary;
MPI_Alloc_mem(sizeof(double) * 2, MPI_INFO_NULL, &boundary);
MPI_Info info;
MPI_Info_create(&info);
MPI_Info_set(info,"no_locks","true");
MPI_Win_create(boundary, 2*sizeof(double), sizeof(double), info, MPI_COMM_WORLD, &win);
Run Code Online (Sandbox Code Playgroud)
在时间循环内:
MPI_Put(&u[1],1,MPI_DOUBLE,LEFT,1,1,MPI_DOUBLE,win);
MPI_Put(&u[NpP],1,MPI_DOUBLE,RIGHT,0,1,MPI_DOUBLE,win);
MPI_Win_fence(0,win);
u[0] = boundary[0];
u[NpP+1] = boundary[1];
Run Code Online (Sandbox Code Playgroud)
它将所需的元素放在窗口中,即boundary
(具有两个元素的数组)在相邻的处理器上u[0]
并u[NpP+1]
从boundary
数组本身获取值.这个实现工作正常,我得到了相同的结果MPI_Send/Recv
.但是,由于我还在使用MPI_Win_fence
,这并不是真正的异步,据我所知,这确保了同步.
问题是:如果我取出MPI_Win_fence
里面的值boundary
永远不会更新并保持初始值.我的理解是,如果没有MPI_Win_fence …
在大量内核上调试我的程序,我遇到了非常奇怪的错误insufficient virtual memory
.我的调查导致代码的和平,主机向每个从机发送小消息.然后我写了一个小程序,其中1个master只发送10个整数,MPI_SEND
所有从属接收它MPI_RECV
./proc/self/status
前后文件的比较MPI_SEND
表明,内存大小之间的差异是巨大的!最有趣的事情(崩溃我的程序)是,这个内存不会释放后MPI_Send
仍然占用大量空间.
有任何想法吗?
System memory usage before MPI_Send, rank: 0
Name: test_send_size
State: R (running)
Pid: 7825
Groups: 2840
VmPeak: 251400 kB
VmSize: 186628 kB
VmLck: 72 kB
VmHWM: 4068 kB
VmRSS: 4068 kB
VmData: 71076 kB
VmStk: 92 kB
VmExe: 604 kB
VmLib: 6588 kB
VmPTE: 148 kB
VmSwap: 0 kB
Threads: 3
System memory usage after MPI_Send, rank 0
Name: test_send_size
State: R (running)
Pid: …
Run Code Online (Sandbox Code Playgroud) 我使用OpenMP编写并行代码.以下是我案例中使用的CMakeLists的一部分.
FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
Run Code Online (Sandbox Code Playgroud)
但是,当我们启动cmake ..时,似乎它没有找到OpenMP包,我得到了这个错误
Try OpenMP C flag = [ ]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-fopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [/openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-Qopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing …
Run Code Online (Sandbox Code Playgroud) 我在使用基本通信和组MPI2方法方面有相当多的经验,并且使用MPI进行了相当多的令人尴尬的并行仿真工作.到目前为止,我已经构建了我的代码,以便有一个调度节点和一堆工作节点.调度节点具有将与模拟器一起运行的参数文件列表.它使用参数文件为每个工作节点播种.工作节点运行其模拟,然后请求调度节点提供的另一个参数文件.运行所有参数文件后,调度节点会在关闭自身之前关闭每个工作节点.
参数文件通常命名为"Par_N.txt",其中N是标识整数(例如,-N = 1-1000).所以我在想,如果我可以创建一个计数器,并且可以在所有节点上同步这个计数器,我就可以省去调度节点,并使系统更简单一些.理论上这听起来很简单,在实践中我怀疑它有点困难,因为我需要确保计数器在被改变时被锁定等等.并且认为可能存在MPI的内置方式处理这个(事情.有什么想法吗?我在想这个吗?
我在Fortran中有一个代码,它使用DGESVD
MKL并在8核上运行英特尔编译器.代码通过OpenMP加速.另外我知道OpenMP和MKL有自己的设置来设置线程数(omp_num_threads
和mkl_num_threads
).我想知道最佳线程数.我应该OMP_NUM_THREADS=1
在调用LAPACK例程之前设置吗?OpenMP线程的数量是否会影响MKL线程数?
在我的test.cu文件中(cu文件项类型是CUDA C/C++)
__global__ void foo()
{
}
void CudaMain()
{
foo<<<1,1>>>();
}
Run Code Online (Sandbox Code Playgroud)
在我的test.cpp文件中
#include "mycuda.cu"
int main()
{
CudaMain();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和compilator在test.cu文件中发送错误"错误c2059语法错误'<'"
只要包含MPI_GET调用,以下简短的Fortran90程序就会崩溃.等级1尝试从等级0读取值并在MPI_WIN_UNLOCK中挂起.排名0尝试在MPI_BARRIER中发生崩溃并出现分段错误.
我反复检查命令的语法,但它们似乎是正确的.C/C++中的类似代码在同一系统上运行.
我正在使用OpenMPI 1.4.3和gfortran 4.4.5.
PROGRAM mpitest
USE mpi
IMPLICIT NONE
INTEGER :: ierr, npe, rnk, win
INTEGER (KIND=MPI_ADDRESS_KIND) lowerbound, sizeofreal
REAL :: val = 1.0, oval = 2.0
CALL MPI_INIT( ierr )
CALL MPI_COMM_RANK( MPI_COMM_WORLD, rnk, ierr )
CALL MPI_COMM_SIZE( MPI_COMM_WORLD, npe, ierr )
CALL MPI_TYPE_GET_EXTENT(MPI_REAL, lowerbound, sizeofreal, ierr)
CALL MPI_WIN_CREATE(val, sizeofreal, sizeofreal, MPI_INFO_NULL, MPI_COMM_WORLD, win, ierr)
IF( rnk .EQ. 1 ) THEN
CALL MPI_WIN_LOCK( MPI_LOCK_SHARED, 0, 0, win, ierr )
CALL MPI_GET( oval, 1, MPI_REAL, 0, 0, 1, …
Run Code Online (Sandbox Code Playgroud) 我已经从 Ubuntu 中可用的标准 apt-get install 安装了 openmpi 库。我运行一个调用 MPI 库的 python 代码。我收到以下错误。任何想法错误的根源是什么?是 OpenMPI 配置错误吗?如何解决这个问题?
[thebigbang:17162] mca: base: component_find: unable to open /usr/lib/openmpi/lib/openmpi/mca_paffinity_hwloc: perhaps a missing symbol, or compiled for a different version of Open MPI? (ignored)
[thebigbang:17162] mca: base: component_find: unable to open /usr/lib/openmpi/lib/openmpi/mca_carto_auto_detect: perhaps a missing symbol, or compiled for a different version of Open MPI? (ignored)
[thebigbang:17162] mca: base: component_find: unable to open /usr/lib/openmpi/lib/openmpi/mca_carto_file: perhaps a missing symbol, or compiled for a different version of Open MPI? (ignored) …
Run Code Online (Sandbox Code Playgroud) mpi ×5
c++ ×3
mpi-rma ×3
fortran ×2
openmp ×2
openmpi ×2
python ×2
asynchronous ×1
c ×1
cmake ×1
count ×1
cuda ×1
infiniband ×1
intel-mkl ×1
intel-mpi ×1
java ×1
linux ×1
python-2.7 ×1
ubuntu-14.04 ×1
utf-8 ×1