diff --git a/configure.ac b/configure.ac index 953f29c6..92b9810c 100644 --- a/configure.ac +++ b/configure.ac @@ -76,7 +76,7 @@ AS_IF([test "x$enable_sse2" != "xno"], [ CFLAGS="-mfpmath=sse -msse2 -DUSE_SSE ${CFLAGS}" ]) -AX_BLAS() +AX_CBLAS() AC_ARG_ENABLE([data-download], [ --disable-data-download Disable downloading data], diff --git a/m4/ax_cblas.m4 b/m4/ax_cblas.m4 new file mode 100644 index 00000000..0c87c29f --- /dev/null +++ b/m4/ax_cblas.m4 @@ -0,0 +1,172 @@ +# =========================================================================== +# http://autoconf-archive.cryp.to/acx_blas.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CBLAS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro looks for a library that implements the CBLAS linear-algebra +# interface (see http://www.netlib.org/blas/). On success, it sets the +# CBLAS_LIBS output variable to hold the requisite library linkages. +# +# To link with CBLAS, you should link with: +# +# $CBLAS_LIBS $LIBS +# +# in that order. +# +# Many libraries are searched for, from ATLAS to CXML to ESSL. The user +# may also use --with-cblas= in order to use some specific CBLAS +# library . +# +# ACTION-IF-FOUND is a list of shell commands to run if a BLAS library is +# found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it is +# not found. If ACTION-IF-FOUND is not specified, the default action will +# define HAVE_BLAS. +# +# This macro requires autoconf 2.50 or later. +# +# LAST MODIFICATION +# +# 2008-12-29 +# +# COPYLEFT +# +# Copyright (c) 2008 Patrick O. Perry +# Copyright (c) 2008 Steven G. Johnson +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Macro Archive. When you make and +# distribute a modified version of the Autoconf Macro, you may extend this +# special exception to the GPL to apply to your modified version as well. + +AC_DEFUN([AX_CBLAS], [ +AC_PREREQ(2.50) +ax_cblas_ok=no + +AC_ARG_WITH(cblas, + [AC_HELP_STRING([--with-cblas=], [use CBLAS library ])]) +case $with_cblas in + yes | "") ;; + no) ax_cblas_ok=disable ;; + -* | */* | *.a | *.so | *.so.* | *.o) CBLAS_LIBS="$with_cblas" ;; + *) CBLAS_LIBS="-l$with_cblas" ;; +esac + +ax_cblas_save_LIBS="$LIBS" + +# First, check CBLAS_LIBS environment variable +if test $ax_cblas_ok = no; then +if test "x$CBLAS_LIBS" != x; then + save_LIBS="$LIBS"; LIBS="$CBLAS_LIBS $LIBS" + AC_MSG_CHECKING([for cblas_dgemm in $CBLAS_LIBS]) + AC_TRY_LINK_FUNC(cblas_dgemm, [ax_cblas_ok=yes], [CBLAS_LIBS=""]) + AC_MSG_RESULT($ax_cblas_ok) + LIBS="$save_LIBS" +fi +fi + +# CBLAS linked to by default? (happens on some supercomputers) +if test $ax_cblas_ok = no; then + save_LIBS="$LIBS"; LIBS="$LIBS" + AC_CHECK_FUNC(cblas_dgemm, [ax_cblas_ok=yes]) + LIBS="$save_LIBS" +fi + +# BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) +if test $ax_cblas_ok = no; then + AC_CHECK_LIB(atlas, ATL_xerbla, + [AC_CHECK_LIB(cblas, cblas_dgemm, + [ax_cblas_ok=yes + CBLAS_LIBS="-lcblas -latlas"], + [], [-latlas])]) +fi + +# BLAS in Intel MKL library? +if test $ax_cblas_ok = no; then + AC_CHECK_LIB(mkl, cblas_dgemm, [ax_cblas_ok=yes;CBLAS_LIBS="-lmkl"]) +fi + +# BLAS in Apple vecLib library? +if test $ax_cblas_ok = no; then + save_LIBS="$LIBS"; LIBS="-framework vecLib $LIBS" + AC_CHECK_FUNC(cblas_dgemm, [ax_cblas_ok=yes;CBLAS_LIBS="-framework vecLib"]) + LIBS="$save_LIBS" +fi + +# BLAS in Alpha DXML library? (now called CXML, see above) +if test $ax_cblas_ok = no; then + AC_CHECK_LIB(dxml, cblas_dgemm, [ax_cblas_ok=yes;CBLAS_LIBS="-ldxml"]) +fi + +# BLAS in Sun Performance library? +if test $ax_cblas_ok = no; then + if test "x$GCC" != xyes; then # only works with Sun CC + AC_CHECK_LIB(sunmath, acosp, + [AC_CHECK_LIB(sunperf, cblas_dgemm, + [CBLAS_LIBS="-xlic_lib=sunperf -lsunmath" + ax_cblas_ok=yes],[],[-lsunmath])]) + fi +fi + +# BLAS in SCSL library? (SGI/Cray Scientific Library) +if test $ax_cblas_ok = no; then + AC_CHECK_LIB(scs, cblas_dgemm, [ax_cblas_ok=yes; CBLAS_LIBS="-lscs"]) +fi + +# BLAS in SGIMATH library? +if test $ax_cblas_ok = no; then + AC_CHECK_LIB(complib.sgimath, cblas_dgemm, + [ax_cblas_ok=yes; CBLAS_LIBS="-lcomplib.sgimath"]) +fi + +# BLAS in IBM ESSL library? (requires generic BLAS lib, too) +if test $ax_cblas_ok = no; then + AC_CHECK_LIB(blas, cblas_dgemm, + [AC_CHECK_LIB(essl, cblas_dgemm, + [ax_cblas_ok=yes; CBLAS_LIBS="-lessl -lblas"], + [], [-lblas])]) +fi + +# Generic CBLAS library? +if test $ax_cblas_ok = no; then + AC_CHECK_LIB(cblas, cblas_dgemm, [ax_cblas_ok=yes; CBLAS_LIBS="-lcblas"]) +fi + +AC_SUBST(CBLAS_LIBS) + +LIBS="$ax_cblas_save_LIBS" + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_cblas_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_CBLAS,1,[Define if you have a CBLAS library.]),[$1]) + : +else + ax_cblas_ok=no + $2 +fi +])dnl AX_CBLAS diff --git a/src/Makefile.am b/src/Makefile.am index 5c599f6d..55f1e7e9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,7 @@ CFLAGS = lib_LTLIBRARIES = libpostal.la libpostal_la_SOURCES = libpostal.c address_dictionary.c transliterate.c tokens.c trie.c trie_search.c trie_utils.c string_utils.c file_utils.c numex.c utf8proc/utf8proc.c cmp/cmp.c geodb.c geo_disambiguation.c normalize.c bloom.c features.c geonames.c geohash/geohash.c unicode_scripts.c msgpack_utils.c address_parser.c address_parser_io.c averaged_perceptron.c crf.c crf_context.c sparse_matrix.c averaged_perceptron_tagger.c graph.c graph_builder.c language_classifier.c language_features.c logistic_regression.c logistic.c minibatch.c float_utils.c ngrams.c -libpostal_la_LIBADD = libscanner.la sparkey/libsparkey.la $(BLAS_LIBS) +libpostal_la_LIBADD = libscanner.la sparkey/libsparkey.la $(CBLAS_LIBS) libpostal_la_CFLAGS = $(CFLAGS_O2) dist_bin_SCRIPTS = libpostal_data @@ -33,10 +33,10 @@ libpostal_SOURCES = main.c json_encode.c libpostal_LDADD = libpostal.la libpostal_CFLAGS = $(CFLAGS_O3) bench_SOURCES = bench.c -bench_LDADD = libpostal.la libscanner.la $(BLAS_LIBS) +bench_LDADD = libpostal.la libscanner.la $(CBLAS_LIBS) bench_CFLAGS = $(CFLAGS_O3) address_parser_SOURCES = address_parser_cli.c json_encode.c linenoise/linenoise.c libpostal.c address_parser.c address_parser_io.c averaged_perceptron.c crf.c crf_context.c sparse_matrix.c graph.c graph_builder.c float_utils.c averaged_perceptron_tagger.c address_dictionary.c normalize.c features.c unicode_scripts.c transliterate.c trie.c trie_search.c trie_utils.c string_utils.c tokens.c file_utils.c utf8proc/utf8proc.c ngrams.c numex.c language_classifier.c language_features.c logistic_regression.c logistic.c minibatch.c -address_parser_LDADD = libscanner.la $(BLAS_LIBS) +address_parser_LDADD = libscanner.la $(CBLAS_LIBS) address_parser_CFLAGS = $(CFLAGS_O3) build_address_dictionary_SOURCES = address_dictionary_builder.c address_dictionary.c file_utils.c string_utils.c trie.c trie_search.c utf8proc/utf8proc.c @@ -49,21 +49,21 @@ build_numex_table_CFLAGS = $(CFLAGS_O3) build_trans_table_SOURCES = transliteration_table_builder.c transliterate.c trie.c trie_search.c file_utils.c string_utils.c utf8proc/utf8proc.c build_trans_table_CFLAGS = $(CFLAGS_O3) address_parser_train_SOURCES = address_parser_train.c address_parser.c address_parser_io.c averaged_perceptron.c crf.c crf_context.c sparse_matrix.c graph.c graph_builder.c float_utils.c averaged_perceptron_trainer.c crf_trainer.c crf_trainer_averaged_perceptron.c averaged_perceptron_tagger.c address_dictionary.c normalize.c features.c unicode_scripts.c transliterate.c trie.c trie_search.c trie_utils.c string_utils.c tokens.c file_utils.c shuffle.c utf8proc/utf8proc.c ngrams.c -address_parser_train_LDADD = libscanner.la $(BLAS_LIBS) +address_parser_train_LDADD = libscanner.la $(CBLAS_LIBS) address_parser_train_CFLAGS = $(CFLAGS_O3) address_parser_test_SOURCES = address_parser_test.c address_parser.c address_parser_io.c averaged_perceptron.c crf.c crf_context.c sparse_matrix.c graph.c graph_builder.c float_utils.c averaged_perceptron_tagger.c address_dictionary.c normalize.c features.c unicode_scripts.c transliterate.c trie.c trie_search.c trie_utils.c string_utils.c tokens.c file_utils.c utf8proc/utf8proc.c ngrams.c -address_parser_test_LDADD = libscanner.la $(BLAS_LIBS) +address_parser_test_LDADD = libscanner.la $(CBLAS_LIBS) address_parser_test_CFLAGS = $(CFLAGS_O3) -language_classifier_train_SOURCES = language_classifier_train.c language_classifier.c language_features.c language_classifier_io.c logistic_regression_trainer.c logistic_regression.c logistic.c sparse_matrix.c sparse_matrix_utils.c features.c minibatch.c float_utils.c stochastic_gradient_descent.c normalize.c transliterate.c trie.c trie_search.c trie_utils.c address_dictionary.c string_utils.c file_utils.c utf8proc/utf8proc.c unicode_scripts.c shuffle.c -language_classifier_train_LDADD = libscanner.la $(BLAS_LIBS) +language_classifier_train_SOURCES = language_classifier_train.c language_classifier.c language_features.c language_classifier_io.c logistic_regression_trainer.c logistic_regression.c logistic.c sparse_matrix.c sparse_matrix_utils.c features.c minibatch.c float_utils.c stochastic_gradient_descent.c ftrl.c regularization.c cartesian_product.c normalize.c transliterate.c trie.c trie_search.c trie_utils.c address_dictionary.c string_utils.c file_utils.c utf8proc/utf8proc.c unicode_scripts.c shuffle.c +language_classifier_train_LDADD = libscanner.la $(CBLAS_LIBS) language_classifier_train_CFLAGS = $(CFLAGS_O3) language_classifier_SOURCES = language_classifier_cli.c language_classifier.c language_features.c logistic_regression.c logistic.c sparse_matrix.c features.c minibatch.c float_utils.c normalize.c transliterate.c trie.c trie_search.c trie_utils.c address_dictionary.c string_utils.c file_utils.c utf8proc/utf8proc.c unicode_scripts.c -language_classifier_LDADD = libscanner.la $(BLAS_LIBS) +language_classifier_LDADD = libscanner.la $(CBLAS_LIBS) language_classifier_CFLAGS = $(CFLAGS_O3) language_classifier_test_SOURCES = language_classifier_test.c language_classifier.c language_classifier_io.c language_features.c logistic_regression.c logistic.c sparse_matrix.c features.c minibatch.c float_utils.c normalize.c transliterate.c trie.c trie_search.c trie_utils.c address_dictionary.c string_utils.c file_utils.c utf8proc/utf8proc.c unicode_scripts.c -language_classifier_test_LDADD = libscanner.la $(BLAS_LIBS) +language_classifier_test_LDADD = libscanner.la $(CBLAS_LIBS) language_classifier_test_CFLAGS = $(CFLAGS_O3)