add Miro's modifications for OpenBLAS detection

This commit is contained in:
Radovan Bast 2016-07-11 16:14:44 +02:00
parent dfd6e41946
commit 4d902ea85c
5 changed files with 271 additions and 4 deletions

View File

@ -7,7 +7,7 @@ matrix:
- os: linux
python: 2.7
compiler: gcc
env: SOURCES=ubuntu-toolchain-r-test
env: SOURCES=ubuntu-toolchain-r-test TEST_SCRIPT=test.py
addons:
apt:
sources:
@ -32,7 +32,7 @@ matrix:
- os: linux
python: 3.5
compiler: gcc
env: SOURCES=ubuntu-toolchain-r-test
env: SOURCES=ubuntu-toolchain-r-test TEST_SCRIPT=test.py
addons:
apt:
sources:
@ -53,6 +53,44 @@ matrix:
# boost
- libboost-all-dev
- os: linux
python: 2.7
compiler: gcc
env: SOURCES=ubuntu-toolchain-r-test TEST_SCRIPT=test_openblas.py
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
# compilers
- g++
- gfortran
- cmake
# math libraries, can not mix with lapack/atlas packages !
- libblas-dev
- libopenblas-dev
# python libraries ...
- libpython2.7
- os: linux
python: 3.5
compiler: gcc
env: SOURCES=ubuntu-toolchain-r-test TEST_SCRIPT=test_openblas.py
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
# compilers
- g++
- gfortran
- cmake
# math libraries, can not mix with lapack/atlas packages !
- libblas-dev
- libopenblas-dev
# python libraries
#- libpython2.7
- os: osx
osx_image: xcode6.4
compiler: gcc
@ -79,7 +117,7 @@ script:
- pep8 --ignore E501,E265 autocmake
# unit tests
- py.test -vv autocmake/*
- py.test -vv test/test.py
- py.test -vv test/$TEST_SCRIPT
notifications:
email: false

124
modules/math/openblas.cmake Normal file
View File

@ -0,0 +1,124 @@
# this file is adapted from https://github.com/BVLC/caffe/blob/master/cmake/Modules/FindOpenBLAS.cmake
# and reused by providing the corresponding copyright notice:
#
#
# COPYRIGHT
#
# All contributions by the University of California:
# Copyright (c) 2014, 2015, The Regents of the University of California (Regents)
# All rights reserved.
#
# All other contributions:
# Copyright (c) 2014, 2015, the respective contributors
# All rights reserved.
#
# Caffe uses a shared copyright model: each contributor holds copyright over
# their contributions to Caffe. The project versioning records all such
# contribution and copyright details. If a contributor wants to further mark
# their specific copyright on a particular contribution, they should indicate
# their copyright solely in the commit message of the change when it is
# committed.
#
# LICENSE
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#
#.rst:
#
# Find and link to OpenBLAS.
#
# Variables defined::
#
# OpenBLAS_FOUND
# OpenBLAS_LIB
# OpenBLAS_INCLUDE_DIR
#
# autocmake.yml configuration::
#
# docopt: "--openblas Find and link to OpenBLAS [default: False]."
# define: "'-DENABLE_OPENBLAS={0}'.format(arguments['--openblas'])"
option(ENABLE_OPENBLAS "Find and link to OpenBLAS" OFF)
if (ENABLE_OPENBLAS)
SET(Open_BLAS_INCLUDE_SEARCH_PATHS
/usr/include
/usr/include/openblas
/usr/include/openblas-base
/usr/local/include
/usr/local/include/openblas
/usr/local/include/openblas-base
/opt/OpenBLAS/include
$ENV{OpenBLAS_HOME}
$ENV{OpenBLAS_HOME}/include
)
SET(Open_BLAS_LIB_SEARCH_PATHS
/lib/
/lib/openblas-base
/lib64/
/usr/lib
/usr/lib/openblas-base
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/OpenBLAS/lib
$ENV{OpenBLAS}cd
$ENV{OpenBLAS}/lib
$ENV{OpenBLAS_HOME}
$ENV{OpenBLAS_HOME}/lib
)
FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS})
FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS})
SET(OpenBLAS_FOUND ON)
# Check include files
IF(NOT OpenBLAS_INCLUDE_DIR)
SET(OpenBLAS_FOUND OFF)
MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off")
ENDIF()
# Check libraries
IF(NOT OpenBLAS_LIB)
SET(OpenBLAS_FOUND OFF)
MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off")
ENDIF()
IF (OpenBLAS_FOUND)
IF (NOT OpenBLAS_FIND_QUIETLY)
MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}")
MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}")
ENDIF (NOT OpenBLAS_FIND_QUIETLY)
ELSE (OpenBLAS_FOUND)
IF (OpenBLAS_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find OpenBLAS")
ENDIF (OpenBLAS_FIND_REQUIRED)
ENDIF (OpenBLAS_FOUND)
MARK_AS_ADVANCED(
OpenBLAS_INCLUDE_DIR
OpenBLAS_LIB
OpenBLAS
)
endif()

View File

@ -3,8 +3,10 @@ min_cmake_version: 2.8
modules:
- fc:
- source: ../../../modules/fc.cmake
- math:
- math1:
- source: ../../../modules/math/blas.cmake
- math2:
- source: ../../../modules/math/openblas.cmake
- default_build_paths:
- source: ../../../modules/default_build_paths.cmake
- src:

View File

@ -1,6 +1,17 @@
if (ENABLE_BLAS)
if(BLAS_FOUND)
add_executable(example example.f90)
target_link_libraries(example ${BLAS_LIBRARIES})
else()
message(FATAL_ERROR "BLAS library not found")
endif()
endif()
if (ENABLE_OPENBLAS)
if(OpenBLAS_FOUND)
add_executable(example example.f90)
target_link_libraries(example ${OpenBLAS_LIB})
else()
message(FATAL_ERROR "OpenBLAS library not found")
endif()
endif()

92
test/test_openblas.py Normal file
View File

@ -0,0 +1,92 @@
import os
import sys
import subprocess
import shlex
import shutil
import sys
import time
import datetime
import pytest
HERE = os.path.abspath(os.path.dirname(__file__))
skip_on_osx = pytest.mark.skipif('sys.platform == "darwin"', reason="not working on osx")
skip_on_linux = pytest.mark.skipif('sys.platform == "linux2"', reason="not working on linux")
skip_always = pytest.mark.skipif('1 == 1', reason="tests are broken")
def exe(command):
"""
Executes command and returns string representations of stdout and stderr captured from the console.
When universal_newlines=True stdout and stderr are opened in text mode.
Otherwise, they are opened in binary mode. In that case captured stdout and stderr
are not strings and Python 3 throws type error when compared against strings later in tests.
Note:
This feature is only available if Python is built with universal newline support (the default).
Also, the newlines attribute of the file objects stdout, stdin and stderr are not updated by the
communicate() method.
See https://docs.python.org/2/library/subprocess.html
"""
stdout, stderr = subprocess.Popen(shlex.split(command),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True).communicate()
if stderr:
sys.stderr.write(stdout)
sys.stderr.write(stderr)
return stdout, stderr
def configure_build_and_exe(name, setup_command, launcher=None):
stamp = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d-%H-%M-%S')
os.chdir(os.path.join(HERE, name, 'cmake'))
shutil.copy(os.path.join('..', '..', '..', 'update.py'), 'update.py')
if os.path.exists('autocmake'):
shutil.rmtree('autocmake')
shutil.copytree(os.path.join('..', '..', '..', 'autocmake'), 'autocmake')
stdout, stderr = exe('python update.py ..')
os.chdir(os.path.join(HERE, name))
make_command = 'make'
binary = './bin/example'
if sys.platform == 'win32':
setup_command += ' --generator="MinGW Makefiles"'
make_command = 'mingw32-make'
binary = 'bin\\\example.exe'
if launcher:
binary = '%s %s' % (launcher, binary)
setup_command += ' build-%s' % stamp
stdout, stderr = exe(setup_command)
assert stderr == ''
os.chdir(os.path.join(HERE, name, 'build-%s' % stamp))
stdout, stderr = exe(make_command)
# we do not check for empty stderr due to warnings flushed to stderr
stdout, stderr = exe(binary)
assert stderr == ''
assert 'PASSED' in stdout
def test_fc():
configure_build_and_exe('fc', 'python setup --fc=gfortran')
def test_fc_blas():
configure_build_and_exe('fc_blas', 'python setup --fc=gfortran --blas')
@skip_on_osx
def test_fc_openblas():
configure_build_and_exe('fc_blas', 'python setup --fc=gfortran --openblas')