-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added cmake detection and test of the OpenBLAS library
- thanks to https://github.com/BVLC/caffe/blob/master/cmake/Modules/FindOpenBLAS.cmake - added dedicated openblas test, which has the same testing source the same as for the blas test (fc_openblas in test_openblas.py) - taken care of ENABLE_OPENBLAS variable - provide openblas package installation for .travis.yml in 2 extra platforms (thanks to Dominic Jodoin <[email protected]>) - closes #172 - .travis.yml : openblas and blas can be together, but not with lapack,atlas packages ! and atlas ! - test/test_openblas.py : test both blas and openblas in new test - test/test.py : test all excep openblas - reduced number of installed packages for blas+openblas to get travis-ci test passed
- Loading branch information
Miro Ilias
authored and
Miro Ilias
committed
Jun 3, 2016
1 parent
808d094
commit a5bbc59
Showing
6 changed files
with
275 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
#.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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
name: example | ||
min_cmake_version: 2.8 | ||
modules: | ||
- fc: | ||
- source: ../../../modules/fc.cmake | ||
- math: | ||
- source: ../../../modules/math/openblas.cmake | ||
- default_build_paths: | ||
- source: ../../../modules/default_build_paths.cmake | ||
- src: | ||
- source: ../../../modules/src.cmake |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
if(OpenBLAS_FOUND) | ||
add_executable(example example.f90) | ||
target_link_libraries(example ${OpenBLAS_LIB}) | ||
else() | ||
message(FATAL_ERROR "OpenBLAS library not found") | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
program example | ||
|
||
implicit none | ||
|
||
integer, parameter :: n = 10 | ||
|
||
integer :: i, j | ||
logical :: test_ok | ||
|
||
real(8), allocatable :: a(:, :) | ||
real(8), allocatable :: b(:, :) | ||
real(8), allocatable :: c(:, :) | ||
|
||
allocate(a(n, n)) | ||
allocate(b(n, n)) | ||
allocate(c(n, n)) | ||
|
||
a = 1.0d0 | ||
b = 2.0d0 | ||
c = 0.0d0 | ||
|
||
call dgemm('n', 'n', n, n, n, 1.0d0, a, n, b, n, 0.0d0, c, n) | ||
|
||
test_ok = .true. | ||
|
||
do i = 1, n | ||
do j = 1, n | ||
if (dabs(c(i, j) - 20.0d0) > tiny(0.0d0)) then | ||
print *, 'ERROR: element', i, j, 'is', c(i, j) | ||
test_ok = .false. | ||
end if | ||
end do | ||
end do | ||
|
||
deallocate(a) | ||
deallocate(b) | ||
deallocate(c) | ||
|
||
if (test_ok) then | ||
print *, 'PASSED' | ||
else | ||
print *, 'FAILED' | ||
end if | ||
|
||
end program |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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_openblas', 'python setup --fc=gfortran --openblas') |