环境:Ubuntu16+Python3
在make后没有问题,make py以后则会报下面的错。问题在于swig3.0.8对于directives支持有问题,可以从swig官网直接下载3.0.12编译安装。apt库里最新的也只是3.0.8。
[@ironhide23586] That version of swig has trouble handling `using` directives. Please try with swig 3.0.12.
如何安装:
- 安装pcre。(sudo apt-get install libpcre3 libpcre3-dev)
- 去swig官网下载指定版本。http://www.swig.org/download.html
tar -zxvf swig-3.0.12.tar.gz
cd swig-3.0.12
# 默认的安装地址为/usr/local/share/
./configure
make
sudo make install
./configure --with-cuda="/usr/local/cuda-9.0" --with-cuda-arch="-gencode=arch=compute_61,code=compute_61"
附:
- gpu版本报错信息nvcc fatal : unsupported gpu architecture 'compute 75'。需要编辑上一步生成的makefile.inc文件,注释掉-gencode=arch=compute_75,code=compute_75这一行
- make 是用来编译的,它从Makefile中读取指令,然后编译
- make -j32在多核cpu上,并行编译是能够提高编译速度的
root@a77fad037489:/home/ubuntu/faiss16# make py
make -C python
make[1]: Entering directory '/home/ubuntu/faiss16/python'
swig -python -c++ -Doverride= -I../ -DSWIGWORDSIZE64 -DGPU_WRAPPER -o swigfaiss.cpp swigfaiss.swig
swigfaiss.swig:366: Warning 302: Identifier 'IndexShards' redefined (ignored) (Renamed from 'IndexShardsTemplate< faiss::Index >'),
../faiss/IndexShards.h:96: Warning 302: previous definition of 'IndexShards'.
swigfaiss.swig:367: Warning 302: Identifier 'IndexBinaryShards' redefined (ignored) (Renamed from 'IndexShardsTemplate< faiss::IndexBinary >'),
../faiss/IndexShards.h:97: Warning 302: previous definition of 'IndexBinaryShards'.
swigfaiss.swig:370: Warning 302: Identifier 'IndexReplicas' redefined (ignored) (Renamed from 'IndexReplicasTemplate< faiss::Index >'),
../faiss/IndexReplicas.h:73: Warning 302: previous definition of 'IndexReplicas'.
swigfaiss.swig:371: Warning 302: Identifier 'IndexBinaryReplicas' redefined (ignored) (Renamed from 'IndexReplicasTemplate< faiss::IndexBinary >'),
../faiss/IndexReplicas.h:74: Warning 302: previous definition of 'IndexBinaryReplicas'.
../faiss/MetaIndexes.h:24: Warning 315: Nothing known about 'IndexT::idx_t'.
../faiss/MetaIndexes.h:67: Warning 315: Nothing known about 'IndexT::idx_t'.
../faiss/MetaIndexes.h:67: Warning 315: Nothing known about 'IndexT::idx_t'.
swigfaiss.swig:374: Warning 302: Identifier 'IndexIDMap' redefined (ignored) (Renamed from 'IndexIDMapTemplate< faiss::Index >'),
../faiss/MetaIndexes.h:59: Warning 302: previous definition of 'IndexIDMap'.
swigfaiss.swig:375: Warning 302: Identifier 'IndexBinaryIDMap' redefined (ignored) (Renamed from 'IndexIDMapTemplate< faiss::IndexBinary >'),
../faiss/MetaIndexes.h:60: Warning 302: previous definition of 'IndexBinaryIDMap'.
swigfaiss.swig:376: Warning 302: Identifier 'IndexIDMap2' redefined (ignored) (Renamed from 'IndexIDMap2Template< faiss::Index >'),
../faiss/MetaIndexes.h:88: Warning 302: previous definition of 'IndexIDMap2'.
swigfaiss.swig:377: Warning 302: Identifier 'IndexBinaryIDMap2' redefined (ignored) (Renamed from 'IndexIDMap2Template< faiss::IndexBinary >'),
../faiss/MetaIndexes.h:89: Warning 302: previous definition of 'IndexBinaryIDMap2'.
g++ -std=c++11 -DFINTEGER=int -fopenmp -I/usr/local/cuda-9.0/include -fPIC -m64 -Wno-sign-compare -g -O3 -Wall -Wextra -mpopcnt -msse4 -I/usr/include/python3.6m -I/usr/include/python3.6m -I/usr/local/lib/python3.6/dist-packages/numpy/core/include \
-I../ -c swigfaiss.cpp -o swigfaiss.o
swigfaiss.cpp: In function 'PyObject* _wrap_Index_ntotal_set(PyObject*, PyObject*)':
swigfaiss.cpp:18309:3: error: 'idx_t' was not declared in this scope
idx_t arg2 ;
^
swigfaiss.cpp:18309:3: note: suggested alternative:
In file included from swigfaiss.cpp:3458:0:
../faiss/IVFlib.h:45:22: note: 'faiss::ivflib::idx_t'
typedef Index::idx_t idx_t;
^
swigfaiss.cpp:18331:15: error: 'temp' was not declared in this scope
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
swigfaiss.cpp:18331:40: error: 'idx_t' does not name a type
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
swigfaiss.cpp:18331:46: error: expected '>' before '*' token
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
swigfaiss.cpp:18331:46: error: expected '(' before '*' token
swigfaiss.cpp:18331:48: error: expected primary-expression before '>' token
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
swigfaiss.cpp:18331:56: error: expected ')' before ';' token
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
swigfaiss.cpp:18332:7: error: 'arg2' was not declared in this scope
arg2 = *temp;
^
swigfaiss.cpp:18333:39: error: type '<type error>' argument given to 'delete', expected pointer
if (SWIG_IsNewObj(res2)) delete temp;
^
swigfaiss.cpp:18336:30: error: 'arg2' was not declared in this scope
if (arg1) (arg1)->ntotal = arg2;
^
swigfaiss.cpp: In function 'PyObject* _wrap_Index_ntotal_get(PyObject*, PyObject*)':
swigfaiss.cpp:18350:3: error: 'idx_t' was not declared in this scope
idx_t result;
^
swigfaiss.cpp:18350:3: note: suggested alternative:
In file included from swigfaiss.cpp:3458:0:
../faiss/IVFlib.h:45:22: note: 'faiss::ivflib::idx_t'
typedef Index::idx_t idx_t;
^
swigfaiss.cpp:18358:3: error: 'result' was not declared in this scope
result = ((arg1)->ntotal);
^
swigfaiss.cpp:18359:39: error: expected type-specifier before 'idx_t'
resultobj = SWIG_NewPointerObj((new idx_t(static_cast< const idx_t& >(result))), SWIGTYPE_p_idx_t, SWIG_POINTER_OWN | 0 );
^
swigfaiss.cpp:1188:89: note: in definition of macro 'SWIG_NewPointerObj'
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^
swigfaiss.cpp:18359:39: error: expected ')' before 'idx_t'
resultobj = SWIG_NewPointerObj((new idx_t(static_cast< const idx_t& >(result))), SWIGTYPE_p_idx_t, SWIG_POINTER_OWN | 0 );
^
swigfaiss.cpp:1188:89: note: in definition of macro 'SWIG_NewPointerObj'
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^
swigfaiss.cpp: In function 'PyObject* _wrap_Index_train(PyObject*, PyObject*)':
swigfaiss.cpp:18617:3: error: 'idx_t' was not declared in this scope
idx_t arg2 ;
^
swigfaiss.cpp:18617:3: note: suggested alternative:
In file included from swigfaiss.cpp:3458:0:
../faiss/IVFlib.h:45:22: note: 'faiss::ivflib::idx_t'
typedef Index::idx_t idx_t;
^
swigfaiss.cpp:18643:15: error: 'temp' was not declared in this scope
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
swigfaiss.cpp:18643:40: error: 'idx_t' does not name a type
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
swigfaiss.cpp:18643:46: error: expected '>' before '*' token
idx_t * temp = reinterpret_cast< idx_t * >(argp2);
^
网友评论