For a specific data analysis, I use the pre-compiled ica_linux
binary from this repository. In the README.md of that repository, the authors state that you can achieve a major speedup when compiling the binary with architecture specific BLAS/LAPACK implementations.
In our case, the speedup might actually save days of computing time, so I am very eager to compile the file with the appropriate libraries. Now, I don't have a lot of experience with makefiles, so I am a bit confused by the process.
My system is a HP ProLiant DL360 Server with two Intel Xeon E5-2650 v3 deca-core processors and Ubuntu 16.04.6 x64 (Xenial Xerus).
sudo git clone https://github.com/sccn/binica
cd binica
I used this manual.
sudo wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
sudo rm GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list
sudo apt update
sudo apt install intel-mkl-2020.0-088
This is the point where I don't really understand which libraries I have to add. I tried the following, but I am not sure whether that is the correct way to proceed.
PLAT = _linux
CC = gcc
CFLAGS = -O3 -ansi
#BLASLIB = ./CLAPACK/lsblaspii1.2f_03.00.a
#BLASLIB = ./CLAPACK/blas$(PLAT).a
#LAPACKLIB = ./CLAPACK/lapack$(PLAT).a
#F2CLIB = ./CLAPACK/F2CLIBS/libF77$(PLAT).a ./CLAPACK/F2CLIBS/libI77$(PLAT).a
#LIBS = $(LAPACKLIB) $(BLASLIB) $(F2CLIB) -lm
LIBS = /opt/intel/mkl/lib/intel64_lin/libmkl_intel_ilp64.a
OBJS = ica.o interfc.o r250.o randlcg.o dsum.o
ica_linux: Makefile.linux ica.h memap.h $(OBJS)
$(CC) -o ica_linux $(OBJS) $(LIBS)
ica.o: Makefile.linux ica.h memap.h ica.c
$(CC) -c ica.c $(CFLAGS)
interfc.o: Makefile.linux ica.h memap.h interfc.c
$(CC) -c interfc.c $(CFLAGS)
memap.o: Makefile.linux memap.h memap.c
$(CC) -c memap.c $(CFLAGS)
r250.o: Makefile.linux r250.h r250.c
$(CC) -c r250.c $(CFLAGS)
randlcg.o: Makefile.linux randlcg.h randlcg.c
$(CC) -c randlcg.c $(CFLAGS)
dsum.o: Makefile.linux dsum.c
$(CC) -c dsum.c $(CFLAGS)
clean:
rm -f *.o
I then ran:
sudo make Makefile.linux clean
sudo make Makefile.linux ica_linux
Which unfortunately fails with this error message:
cd ~/Downloads/binica
sudo make Makefile.linux ica_linux
Output:
make: Nothing to be done for 'Makefile.linux'.
gcc -c ica.c -O3 -ansi
ica.c: In function ‘sigproc’:
ica.c:565:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("number of components = %d\n",COMP_NUMBER);
^
ica.c:566:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("number of channels = %d\n",CH_NUMBER);
^
ica.c: In function ‘runica’:
ica.c:904:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("step %d - lrate %5f, wchange %7.6f, angledelta %4.1f deg\n",step,lrate,change,DEGCONST*angledelta);
^
ica.c:907:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("step %d - lrate %5f, wchange %7.6f, angledelta %4.1f deg, %d subgauss\n",step,lrate,change,DEGCONST*angledelta,j);
^
ica.c:907:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 6 has type ‘integer {aka long int}’ [-Wformat=]
ica.c:914:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("step %d - lrate %5f, wchange %7.6f\n",step,lrate,change);
^
ica.c:917:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("step %d - lrate %5f, wchange %7.6f, %d subgauss\n",step,lrate,change,j);
^
ica.c:917:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘integer {aka long int}’ [-Wformat=]
gcc -c interfc.c -O3 -ansi
interfc.c:50:17: warning: missing terminating " character
#define HELPMSG "# ica - Perform Independent Component Analysis, standalone-version
^
interfc.c:52:5: error: invalid preprocessing directive #Run
# Run the ICA algorithm of Bell & Sejnowski (1996) or the extended-ICA
^
interfc.c:53:5: error: invalid preprocessing directive #of
# of Lee, Girolami & Sejnowski (1998). Original Matlab code: Scott Makeig,
^
interfc.c:54:5: error: invalid preprocessing directive #Tony
# Tony Bell, et al.; C++ code: Sigurd Enghoff, CNL / Salk Institute 7/98
^
interfc.c:56:5: error: invalid preprocessing directive #Usage
# Usage: % ica < my.sc
^
interfc.c:58:5: error: invalid preprocessing directive #Leading
# Leading # -> use default values
^
interfc.c:59:5: error: invalid preprocessing directive #Edit
# Edit a copy of this file to run an ica decomposition
^
interfc.c:60:5: error: invalid preprocessing directive #Contacts
# Contacts: {enghoff,scott,terry,tony,tewon}@salk.edu
^
interfc.c:62:3: error: invalid preprocessing directive #Required
# Required variables:
^
interfc.c:63:5: error: unknown type name ‘DataFile’
DataFile berger/modeldata # Input data to decompose (floats multiplexed
^
interfc.c:63:24: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘/’ token
DataFile berger/modeldata # Input data to decompose (floats multiplexed
^
interfc.c:63:35: error: stray ‘#’ in program
DataFile berger/modeldata # Input data to decompose (floats multiplexed
^
interfc.c:64:32: error: invalid preprocessing directive #by
# by channel (i.e., chan1, chan2, ...))
^
interfc.c:65:28: error: stray ‘#’ in program
chans 31 # Number of data channels (= data rows)
^
interfc.c:66:28: error: stray ‘#’ in program
frames 768 # Number of data points per epoch (= data columns)
^
interfc.c:67:28: error: stray ‘#’ in program
epochs 436 # Number of epochs
^
interfc.c:69:3: error: invalid preprocessing directive #FrameWindow
# FrameWindow 20 # Number of frames per window
^
interfc.c:70:3: error: invalid preprocessing directive #FrameStep
# FrameStep 4 # Number of frames to step per window
^
interfc.c:71:3: error: invalid preprocessing directive #EpochWindow
# EpochWindow 100 # Number of epochs per window
^
interfc.c:72:3: error: invalid preprocessing directive #EpochStep
# EpochStep 25 # Number of epochs to step per window
^
interfc.c:73:3: error: invalid preprocessing directive #Baseline
# Baseline 25 # Number of data points contained in baseline
^
interfc.c:75:36: error: stray ‘#’ in program
WeightsOutFile berger/data.wts # Output ICA weight matrix (floats)
^
interfc.c:76:35: error: stray ‘#’ in program
SphereFile berger/data.sph # Output sphering matrix (floats)
^
interfc.c:78:3: error: invalid preprocessing directive #Processing
# Processing options:
^
interfc.c:80:5: error: invalid preprocessing directive #sphering
# sphering on # Flag sphering of data (on/off) {default: on}
^
interfc.c:81:5: error: invalid preprocessing directive #bias
# bias on # Perform bias adjustment (on/off) {default: on}
^
interfc.c:82:5: error: stray ‘\’ in program
\exextended 1 # Perform \"extended-ICA\" using tnah() with kurtosis
^
interfc.c:82:31: error: stray ‘#’ in program
\exextended 1 # Perform \"extended-ICA\" using tnah() with kurtosis
^
interfc.c:82:5: error: stray ‘\’ in program
\exextended 1 # Perform \"extended-ICA\" using tnah() with kurtosis
^
interfc.c:82:42: warning: missing terminating " character
\exextended 1 # Perform \"extended-ICA\" using tnah() with kurtosis
^
interfc.c:82:5: error: missing terminating " character
\exextended 1 # Perform \"extended-ICA\" using tnah() with kurtosis
^
interfc.c:83:31: error: invalid preprocessing directive #estimation
# estimation every N training blocks. If N < 0,
^
interfc.c:84:31: error: invalid preprocessing directive #fix
# fix number of sub-Gaussian components to -N
^
interfc.c:85:31: error: invalid preprocessing directive #{
# {default|0: off}
^
interfc.c:86:5: error: invalid preprocessing directive #pca
# pca 0 # Decompose a principal component subspace of
^
interfc.c:87:31: error: invalid preprocessing directive #the
# the data. Retain this many PCs. {default|0: all}
^
interfc.c:88:3: error: invalid preprocessing directive #Optional
# Optional input variables:
^
interfc.c:90:4: error: invalid preprocessing directive #WeightsInFile
# WeightsInFile input.wts # Starting ICA weight matrix (nchans,ncomps)
^
interfc.c:91:31: error: invalid preprocessing directive #{
# {default: identity or sphering matrix}
^
interfc.c:92:28: error: stray ‘#’ in program
lrate 2.0e-3 # Initial ICA learning rate (float << 1)
^
interfc.c:93:31: error: invalid preprocessing directive #{
# {default: heuristic ~5e-4}
^
interfc.c:94:5: error: invalid preprocessing directive #blocksize
# blocksize 20 # ICA block size (integer << datalength)
^
interfc.c:95:31: error: invalid preprocessing directive #{
# {default: heuristic fraction of log data length}
^
interfc.c:96:5: error: invalid preprocessing directive #stop
# stop 1.0e-6 # Stop training when weight-change < this value
^
interfc.c:97:31: error: invalid preprocessing directive #{
# {default: heuristic ~0.000001}
^
interfc.c:98:28: error: stray ‘#’ in program
maxsteps 512 # Max. number of ICA training steps {default: 128}
^
interfc.c:99:5: error: invalid preprocessing directive #posact
# posact on # Make each component activation net-positive
^
interfc.c:100:30: error: invalid preprocessing directive #(
# (on/off) {default: on}
^
interfc.c:101:5: error: invalid preprocessing directive #annealstep
# annealstep 0.98 # Annealing factor (range (0,1]) - controls
^
interfc.c:102:31: error: invalid preprocessing directive #the
# the speed of convergence.
^
interfc.c:103:5: error: invalid preprocessing directive #annealdeg
# annealdeg 60 # Angledelta threshold for annealing {default: 60}
^
interfc.c:104:5: error: invalid preprocessing directive #momentum
# momentum 0.0 # Momentum gain (range [0,1]) {default: 0}
^
interfc.c:105:5: error: invalid preprocessing directive #verbose
# verbose off # Give ascii messages (on/off) {default: on}
^
interfc.c:107:3: error: invalid preprocessing directive #Optional
# Optional outputs:
^
interfc.c:109:4: error: invalid preprocessing directive #ActivationsFile
# ActivationsFile data.act # Activations of each component (ncomps,points)
^
interfc.c:110:4: error: invalid preprocessing directive #BiasFile
# BiasFile data.bs # Bias weights (ncomps,1)
^
interfc.c:111:4: error: invalid preprocessing directive #SignFile
# SignFile data.sgn # Signs designating (-1) sub- and (1) super-Gaussian
^
interfc.c:112:31: error: invalid preprocessing directive #components
# components (ncomps,1)
^
interfc.c:114:3: error: invalid preprocessing directive #This
# This script, \"ica.sc\" is a sample ica script file. Copy and modify it as
^
interfc.c:114:17: warning: missing terminating " character
# This script, \"ica.sc\" is a sample ica script file. Copy and modify it as
^
interfc.c:115:3: error: invalid preprocessing directive #desired
# desired. Note that the input data file(s) must be native floats."
^
interfc.c:115:67: warning: missing terminating " character
# desired. Note that the input data file(s) must be native floats."
^
interfc.c: In function ‘help’:
interfc.c:170:3: error: missing terminating " character
puts(HELPMSG);
^
interfc.c:170:3: error: too few arguments to function ‘puts’
interfc.c: In function ‘doit’:
interfc.c:679:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("PDF will be calculated initially every %d blocks using %d data points.\n",extblocks,pdfsize);
^
interfc.c:679:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘integer {aka long int}’ [-Wformat=]
interfc.c:681:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘integer {aka long int}’ [-Wformat=]
printf("PDF will not be calculated. Exactly %d sub-Gaussian components assumed.\n",nsub);
^
interfc.c:684:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘integer {aka long int}’ [-Wformat=]
printf("Initial learning rate will be %g, block size %d.\n",lrate,block);
^
interfc.c:690:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘integer {aka long int}’ [-Wformat=]
printf("Training will end when wchange < %g or after %d steps.\n",nochange,maxsteps);
^
interfc.c: In function ‘master’:
interfc.c:923:16: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
keys->token = strdup(token);
^
Makefile:19: recipe for target 'interfc.o' failed
make: *** [interfc.o] Error 1
I don't really understand which libraries I have to add
Do understand the list of Intel MKL libraries you need to add. Please refer to the Intel MKL Linker Adviser to choose the list of libraries needed to add. Here is the list of this article: