我已经在这里阅读了几乎所有关于CUDA,C++和makefile的问题,但仍无法解决我的问题.
我的项目目录中有一些.cpp文件和一些.cu文件src/(以及.h&.cuh),我想用makefile构建我的应用程序.
我试过这样做:
SRC_DIR = src
OBJ_DIR = obj
CPP_FILES = $(wildcard $(SRC_DIR)/*.cpp)
CU_FILES = $(wildcard $(SRC_DIR)/*.cu)
H_FILES = $(wildcard $(SRC_DIR)/*.h)
CUH_FILES = $(wildcard $(SRC_DIR)/*.cuh)
OBJ_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.o)))
CUO_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(CU_FILES:.cu=.cu.o)))
$(TARGET) : $(OBJ_FILES) $(CUO_FILES)
$(LD) $(LDFLAGS) $(LIB_CUDA) -o $@ $?
$(CUO_FILES) : $(CU_FILES) $(CUH_FILES)
$(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o $@ $<
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(H_FILES)
$(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)
直到我有了第二个.cu文件才行.然后我尝试了:
<... previous …Run Code Online (Sandbox Code Playgroud) 我想编写一个在3D矩阵上工作的并行代码,其中每个进程都有自己的子矩阵,但是为了完成他们的工作,他们需要一些关于其相邻进程的子矩阵(只是边界平面)的信息.我通过点对点通信发送这些信息但我知道对于大型矩阵来说这不是一个好主意所以我决定使用派生数据类型进行通信.我有问题mpi_type_vector:例如我有一个NX*NY*NZ矩阵,我想发送常量的平面NY到另一个进程我写这些行来做这个:
MPI_Datatype sub;
MPI_Type_vector(NX, NZ, NY*NZ, MPI_DOUBLE, &sub);
MPI_Type_commit(&sub);
Run Code Online (Sandbox Code Playgroud)
但它不起作用(不能发送我想要的飞机).怎么了?我的测试代码在这里:
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc,char ** argv)
{
int const IE=100,JE=25,KE=100;
int size,rank;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Datatype sub;
MPI_Type_vector(KE,IE,IE+(JE-1)*IE,MPI_DOUBLE,&sub);
MPI_Type_commit(&sub);
if (rank==0){
double*** a=new double**[IE];
for(int i=0;i<IE;i++){
a[i]=new double *[JE];
for(int j=0;j<JE;j++){
a[i][j]=new double [KE];
}
}
for(int i=0;i<IE;i++){
for(int j=0;j<JE;j++){
for(int k=0;k<KE;k++){
a[i][j][k]=2;
}}}
for(int i=0;i<IE;i++){
for(int j=0;j<JE;j++){
a[i][j][0]=2;
}}
MPI_Send(&a[0][0][0],1,sub,1,52,MPI_COMM_WORLD);
}
if (rank==1){
double*** b=new …Run Code Online (Sandbox Code Playgroud) 我正在使用Schaum的Fortran 77编程概述,并且有一个关于使用包围值组方法进行二进制搜索的示例.首先这里是代码:
INTEGER X(100)
INTEGER RANGE
INTEGER START , FINISH
PRINT *, 'Number of values ?'
READ *, N
DO 10 I = 1, N
READ *, X(I)
END DO
PRINT *, 'Enter Value'
READ *, VAL
START = 1
FINISH = N
RANGE = FINISH - START
MID = (START + FINISH) /2
DO WHILE( X(MID) .NE. VAL .AND. RANGE .NE. 0)
IF (VAL .GT. X(MID))THEN
START = MID
ELSE
FINISH = MID
END IF
RANGE = FINISH - …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
Program function_as_an_array
implicit none
integer:: i
integer, parameter:: N=10
real*8:: x(N),y(N),f(N)
do i=1,N
x(i)=float(i)
end do
call func(f,N,x)
open(unit=20, file='test.dat')
do i=1,N
y(i)=f(i)
write(20,*) x(i),y(i)
end do
close(20)
Stop
End Program function_as_an_array
Subroutine func(f,N,x)
implicit none
integer i,N
real*8:: x(N),f(N)
do i=1,N
f(i)=x(i)**2
end do
end Subroutine func
Run Code Online (Sandbox Code Playgroud)
我想让程序确实用于"作为arrray的功能",即我想替换Subroutine funcby function f和得到相同的结果(在主程序中,我希望保持一个声明y=f(x,N)).我怎样才能做到这一点?
谢谢.
MPI_Sendrecv,MPI_Scatter,等等- -在MPI描述发送和接收许多程序对数和类型参数都发送和接收.例如,在Fortran中,MPI_Scatter的签名是:
MPI_SCATTER(SENDBUF, SENDCOUNT, SENDTYPE,
RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
Run Code Online (Sandbox Code Playgroud)
如果发送的数据量必须与收到的数量相同,为什么还需要?这不仅仅是引入不一致的可能性吗?
需要不同计数/类型的用例是什么?
如果我分配一个F90指针会发生什么:
real, pointer :: abc(:)
allocate abc (nx*ny*nz)
Run Code Online (Sandbox Code Playgroud)
我将abc传递给子程序,在那里我将其重新定义为
real arg1(nx,ny,xz)
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.
但如果我重新定义为2D数组,我会得到一个段错误.
real arg1(nx,ny)
Run Code Online (Sandbox Code Playgroud)
使用上面重新排序的数组,它应该工作.为什么会失败?任何帮助将不胜感激.
谢谢.
这是试图解决3*3的线性方程并打印出结果,但它在注释行中出现问题:
我在程序之外定义了LinearSolution模块,我应该在里面定义它吗?有什么不同?
为什么它说这个语句是递归的,你知道,当我使用这些语句作为普通的子程序而不是模块子程序时,它们被证实是好的.
module LinearSolution
type LAE
integer::N
double precision,dimension(:,:),allocatable::A
double precision,dimension( :),allocatable::B
contains
procedure,nopass::RowReduction
end type LAE
contains
subroutine RowReduction
double precision::C
do k=1,N
do i=k+1,N
if(A(k,k)/=0) then
C=A(i,k)/A(k,k)
B(i)=B(i)-B(k)*C !error: Statement Function is recursive
do j=k+1,N
A(i,j)=A(i,j)-A(k,j)*C !error: Statement Function is recursive
end do
end if
end do
end do
do k=N,1,-1
do i=k-1,1,-1
if(A(k,k)/=0) then
C=A(i,k)/A(k,k)
B(i)=B(i)-B(k)*C !error: Statement Function is recursive
end if
end do
end do
do k=1,N
if(A(k,k)/=0) then
B(k)=B(k)/A(k,k) !error: Statement Function is …Run Code Online (Sandbox Code Playgroud) 只是在面试之前查看一些注释,并且正在努力理解Odd-Even排序在并行体系结构中是如何工作的.
int MPI_OddEven_Sort(int n, double *a, int root, MPI_Comm comm)
{
int rank, size, i, sorted_result;
double *local_a;
// get rank and size of comm
MPI_Comm_rank(comm, &rank); //&rank = address of rank
MPI_Comm_size(comm, &size);
local_a = (double *) calloc(n / size, sizeof(double));
// scatter the array a to local_a
MPI_Scatter(a, n / size, MPI_DOUBLE, local_a, n / size, MPI_DOUBLE,
root, comm);
// sort local_a
merge_sort(n / size, local_a);
//odd-even part
for (i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我正在阅读"使用MPI-2"并尝试自己执行代码.我为MPI_File_open指定了MPI_MODE_CREATE,但它实际上没有创建新文件,而是覆盖了具有相同名称的先前文件.我碰巧在第一次运行更多进程时找到了这个,然后用更少的进程运行.我的MPI版本是openmpi 1.8.1.
这是代码
#include <stdio.h>
#include <mpi.h>
#define BUFSIZE 4
int main(int argc, char **argv)
{
int map[BUFSIZE], i, rank , size;
char buf[BUFSIZE];
MPI_File fh;
MPI_Datatype filetype;
MPI_Status status;
MPI_Offset disp=0;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
for(i=0;i<BUFSIZE;i++)
{
// buf[i]=size*i+rank+'0';
buf[i]=size*i+rank+'A';
map[i]=size*i+rank;
}
MPI_File_open(MPI_COMM_WORLD, "datafile4", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
MPI_Type_create_indexed_block(BUFSIZE, 1, map, MPI_CHAR, &filetype);
MPI_Type_commit(&filetype);
MPI_File_set_view(fh, disp, MPI_CHAR, filetype, "native", MPI_INFO_NULL);
MPI_File_write_all(fh, buf, BUFSIZE, MPI_CHAR, &status);
MPI_File_close(&fh);
MPI_Type_free(&filetype);
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我运行6个进程时的文件内容
ABCDEFGHIJKLMNOPQRSTUVWX
Run Code Online (Sandbox Code Playgroud)
然后我修改了一下.替代
buf[i]=size*i+rank+'A';
Run Code Online (Sandbox Code Playgroud)
同
buf[i]=size*i+rank+'0';
Run Code Online (Sandbox Code Playgroud)
并运行2个进程,文件如下 …
我正在优化 MPI 代码并且正在使用 Gprof。问题是我得到的结果完全不合理。我的工作流程如下:
编译代码添加-pg为编译标志。
运行代码mpirun -np Nproc EXEC.exe arg1 ... argN。
在可执行文件上运行 gprof gprof EXEC.exe
这有什么问题?