Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编译MPI C代码时出现SWIG错误&引用;未定义符号:ompi“mpi”int“;_Python_C_Mpi_Swig - Fatal编程技术网

Python 编译MPI C代码时出现SWIG错误&引用;未定义符号:ompi“mpi”int“;

Python 编译MPI C代码时出现SWIG错误&引用;未定义符号:ompi“mpi”int“;,python,c,mpi,swig,Python,C,Mpi,Swig,我正在尝试使用SWIG包装器编译MPIC代码,以实现Python接口。从StackOverflow和google,我知道这是SWIG包装过程中的链接问题,但我无法找到解决问题的方法 我使用以下行进行编译: >swig -python worker_c.i >mpicc -fPIC $(python-config --includes) -c worker_c.c worker_c_wrap.c >ld -zmuldefs -shared worker_c.o worker_c_

我正在尝试使用SWIG包装器编译MPIC代码,以实现Python接口。从StackOverflow和google,我知道这是SWIG包装过程中的链接问题,但我无法找到解决问题的方法

我使用以下行进行编译:

>swig -python worker_c.i
>mpicc -fPIC $(python-config --includes) -c worker_c.c worker_c_wrap.c
>ld -zmuldefs -shared worker_c.o worker_c_wrap.o -o _worker_c.so
导入生成的worker_c.py产生:

Python 2.7.2+ (default, Jul 20 2012, 22:15:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import worker_c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "worker_c.py", line 25, in <module>
    _worker_c = swig_import_helper()
  File "worker_c.py", line 21, in swig_import_helper
    _mod = imp.load_module('_worker_c', fp, pathname, description)
ImportError: ./_worker_c.so: undefined symbol: ompi_mpi_int
Python 2.7.2+(默认,2012年7月20日,22:15:08)
[GCC 4.6.1]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口工人
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“worker_c.py”,第25行,在
_worker\u c=swig\u import\u helper()
swig\u import\u helper中第21行的文件“worker\u c.py”
_mod=imp.load_模块(“工作线程”,fp,路径名,描述)
导入错误:./\u worker\u c.so:未定义符号:ompi\u mpi\u int
以下是我的源代码:

工人c.c

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

const int nelements1 = 1E3;
const int nelements2 = 1E6;

int outarray(){
    float* array = malloc(sizeof(float) * nelements2);
    int i = 0;
    for( i = 0; i < nelements2; i++ ){
        array[i] = 1.110001;
    }

    return *array;
}

int main(int argc, char *argv[]){

MPI_Comm comm;
MPI_Comm_get_parent(&comm);

int myid, world_size;//, size;
int root = 0;
int* endloop = malloc(sizeof(int));
void* input = malloc(sizeof(float) * nelements1);
void* output;
void* sendbuff;
int recv = 1;

MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);

output = (void *)outarray();

MPI_Scatter(sendbuff, recv, MPI_INT, endloop, recv, MPI_INT, root, comm);

while ( endloop[0] < 1) {
    MPI_Barrier(comm);
    MPI_Scatter(sendbuff, recv, MPI_FLOAT, input, nelements1, MPI_FLOAT, root, comm);
    MPI_Barrier(comm);
    MPI_Gather(sendbuff, recv, MPI_FLOAT, output, nelements2, MPI_FLOAT, root, comm);
    MPI_Scatter(sendbuff, recv, MPI_INT, endloop, recv, MPI_INT, root, comm);
}

free(endloop);
free(input);

MPI_Finalize();
}
#包括
#包括
#包括
常数int nelements1=1E3;
常数int nelements2=1E6;
int out数组(){
float*array=malloc(sizeof(float)*nelements2);
int i=0;
对于(i=0;i
工薪阶层

// file: worker_c.i
%module worker_c
%{
#include <mpi.h>
#include <stdlib.h>
#include "worker_c.c"
%}

%include mpi4py/mpi4py.i
%mpi4py_typemap(Comm, MPI_Comm);
void outarray();
void main(int argc, char *argv[]);
//文件:worker\u c.i
%模块工人
%{
#包括
#包括
#包括“工人c.c”
%}
%包括mpi4py/mpi4py.i
%mpi4py_类型图(通信,MPI_通信);
void out数组();
void main(int argc,char*argv[]);
我在SWIG和MPI方面几乎没有经验,因此我非常感谢您提供的任何帮助。
谢谢大家!

链接共享对象时,它不包含对MPI实现库的引用(在您的示例中打开MPI)。您应该使用MPI编译器包装而不是
ld
来链接共享库。谢谢@hristoilev!我不知道可以使用MPI编译器包装来代替
ld
mpicc
只是包装一些编译器,例如GCC。只要后者能够将独立的对象文件链接到可执行文件和共享库中(可能在幕后调用
ld
),
mpicc
也可以。太好了,谢谢@hristoilev的解释。不幸的是,现在我遇到了一个令人生畏的segfault错误,但我想我必须为这个错误再写一篇文章。您的
main()
函数缺少对
MPI_Init()
的调用。MPI是否在其他地方初始化?