小编Jon*_*rsi的帖子

makefile for C++/CUDA项目

我已经在这里阅读了几乎所有关于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)

cuda makefile

4
推荐指数
1
解决办法
5772
查看次数

如何将3DI派生数据类型用于3D阵列?

我想编写一个在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)

c++ mpi

4
推荐指数
1
解决办法
2513
查看次数

使用Fortran进行数组问题的二进制搜索

我正在使用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)

arrays search fortran

4
推荐指数
1
解决办法
2695
查看次数

定义返回数组的函数

我有以下代码:

    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)).我怎样才能做到这一点?

谢谢.

arrays fortran function fortran90

4
推荐指数
1
解决办法
307
查看次数

您何时会使用不同的计数或类型来发送和接收进程?

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)

如果发送的数据量必须与收到的数量相同,为什么还需要?这不仅仅是引入不一致的可能性吗?

需要不同计数/类型的用例是什么?

mpi

4
推荐指数
1
解决办法
246
查看次数

Fortran 90阵列通过引用问题传递

如果我分配一个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)

使用上面重新排序的数组,它应该工作.为什么会失败?任何帮助将不胜感激.

谢谢.

fortran pointers memory-management fortran90

3
推荐指数
1
解决办法
1339
查看次数

错误:语句函数是递归的

这是试图解决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)

recursion fortran module subroutine fortran90

3
推荐指数
1
解决办法
2652
查看次数

MPI Odd-Even排序如何工作?

只是在面试之前查看一些注释,并且正在努力理解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)

c sorting mpi

3
推荐指数
1
解决办法
6167
查看次数

如何使用MPI_File_open替换MPI中的现有文件

我正在阅读"使用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个进程,文件如下 …

filesystems file-io operating-system hpc mpi

3
推荐指数
1
解决办法
955
查看次数

如何在 MPI 代码上从 gprof 获得有意义的结果?

我正在优化 MPI 代码并且正在使用 Gprof。问题是我得到的结果完全不合理。我的工作流程如下:

  • 编译代码添加-pg为编译标志。

  • 运行代码mpirun -np Nproc EXEC.exe arg1 ... argN

  • 在可执行文件上运行 gprof gprof EXEC.exe

这有什么问题?

hpc mpi gprof

3
推荐指数
1
解决办法
1064
查看次数