thundersvm
thundersvm copied to clipboard
Ubuntu, Linker error, CPU-only
Hi.
Im getting an linker error while building thundersvm for working on CPU only. Im doing
git clone https://github.com/Xtra-Computing/thundersvm.git
cd thundersvm
git submodule init eigen && git submodule update
git submodule update --init src/test/googletest
mkdir build && cd build && cmake -DUSE_CUDA=OFF .. && make -j
As a result Im getting:
[ 96%] Linking CXX executable ../../bin/thundersvm-predict
/usr/bin/ld: ../../lib/libthundersvm.so: undefined reference to `svm_kernel::sum_kernel_values_instant(SyncArray<double> const&, int, SyncArray<int> const&, SyncArray<int> const&, SyncArray<double> const&, SyncArray<float> const&, SyncArray<double>&, int, int, SyncArray<double>&)'
collect2: error: ld returned 1 exit status
make[2]: *** [src/thundersvm/CMakeFiles/thundersvm-predict.dir/build.make:100: bin/thundersvm-predict] Błąd 1
make[1]: *** [CMakeFiles/Makefile2:154: src/thundersvm/CMakeFiles/thundersvm-predict.dir/all] Błąd 2
make[1]: *** Oczekiwanie na niezakończone zadania....
[100%] Linking CXX executable ../../bin/thundersvm-train
/usr/bin/ld: ../../lib/libthundersvm.so: undefined reference to `svm_kernel::sum_kernel_values_instant(SyncArray<double> const&, int, SyncArray<int> const&, SyncArray<int> const&, SyncArray<double> const&, SyncArray<float> const&, SyncArray<double>&, int, int, SyncArray<double>&)'
collect2: error: ld returned 1 exit status
make[2]: *** [src/thundersvm/CMakeFiles/thundersvm-train.dir/build.make:100: bin/thundersvm-train] Błąd 1
make[1]: *** [CMakeFiles/Makefile2:128: src/thundersvm/CMakeFiles/thundersvm-train.dir/all] Błąd 2
make: *** [Makefile:136: all] Błąd 2
Indeed the shared object file do not contain this symbol. The following returns no lines:
nm --demangle --extern-only --defined-only ./lib/libthundersvm.so |grep sum_kernel_values_instant
Grepping the source to find this symbol indicates that the function is defined only in ./src/thundersvm/kernel/kernelmatrix_kernel.cu which is not included in building process for CPU-only version. (Am I right?) Log of the following command is included.
grep -rni "sum_kernel_values_instant" ../ >./grep.log
Host info: OS: Ubuntu 22.04.4 LTS x86_64 Kernel: 5.15.0-101-generic CPU: Intel i7-8665U (8) @ 4.800GHz GPU: Intel WhiskeyLake-U GT2 [UHD Graphics 620]
Best Regards, Pawel
I encountered the same problem, did you solve it?
Hi,
Unfortunately, I haven't solved it yet.
Regards, Pawel
Same problem here.
I found that the svm_kernel::sum_kernel_values_instant
function is used in src/thundersvm/model/svmmodel.cpp
(the predict_dec_values_instant
function) :
- https://github.com/Xtra-Computing/thundersvm/blob/master/src/thundersvm/model/svmmodel.cpp#L147
However, this is a function declared in include/thundersvm/kernel/kernelmatrix_kernel.h
and there is only an implementation of CUDA in src/thundersvm/kernel/kernelmatrix_kernel.cu
.
Thus, the compilation will failed in CPU only mode.
I solved this problem in an ugly but effective way. After successful compilation, it can be trained and predicted correctly using the adult dataset.
Just comment out the following two lines of code:
- https://github.com/Xtra-Computing/thundersvm/blob/5c6a056ac7f474b085d5415c81c5d48a1419642a/src/thundersvm/model/svmmodel.cpp#L147
- https://github.com/Xtra-Computing/thundersvm/blob/5c6a056ac7f474b085d5415c81c5d48a1419642a/src/thundersvm/model/svmmodel.cpp#L16
This operation will not affect CPU training and prediction
@xichichixi That works