-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[OpenMP] Initial implementation of OpenMP offloading library - libomp…
…target. This is the patch upstreaming the device-agnostic part of libomptarget. Differential Revision: https://reviews.llvm.org/D14031 llvm-svn: 293094
- Loading branch information
George Rokos
committed
Jan 25, 2017
1 parent
c0fc253
commit 2467df6
Showing
15 changed files
with
3,357 additions
and
0 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,142 @@ | ||
# | ||
#//===----------------------------------------------------------------------===// | ||
#// | ||
#// The LLVM Compiler Infrastructure | ||
#// | ||
#// This file is dual licensed under the MIT and the University of Illinois Open | ||
#// Source Licenses. See LICENSE.txt for details. | ||
#// | ||
#//===----------------------------------------------------------------------===// | ||
# | ||
|
||
===================================================================== | ||
How to Build the LLVM* OpenMP* Offloading Runtime Library using CMake | ||
===================================================================== | ||
|
||
==== Version of CMake required: v2.8.0 or above ==== | ||
|
||
============================================ | ||
How to call cmake initially, then repeatedly | ||
============================================ | ||
- When calling cmake for the first time, all needed compiler options | ||
must be specified on the command line. After this initial call to | ||
cmake, the compiler definitions must not be included for further calls | ||
to cmake. Other options can be specified on the command line multiple | ||
times including all definitions in the Build options section below. | ||
- Example of configuring, building, reconfiguring, rebuilding: | ||
$ mkdir build | ||
$ cd build | ||
$ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ .. # Initial configuration | ||
$ make | ||
... | ||
$ make clean | ||
$ cmake -DCMAKE_BUILD_TYPE=Debug .. # Second configuration | ||
$ make | ||
... | ||
$ rm -rf * | ||
$ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ .. # Third configuration | ||
$ make | ||
- Notice in the example how the compiler definitions are only specified | ||
for an empty build directory, but other Build options are used at any time. | ||
- The file CMakeCache.txt which is created after the first call to cmake | ||
is a configuration file which holds all the values for the Build options. | ||
These configuration values can be changed using a text editor to modify | ||
CMakeCache.txt as opposed to using definitions on the command line. | ||
- To have cmake create a particular type of build generator file simply | ||
inlude the -G <Generator name> option: | ||
$ cmake -G "Unix Makefiles" ... | ||
You can see a list of generators cmake supports by executing cmake with | ||
no arguments and a list will be printed. | ||
|
||
===================== | ||
Instructions to Build | ||
===================== | ||
$ cd libomptarget_top_level/ [ directory with plugins/ , deviceRTLs/ , etc. ] | ||
$ mkdir build | ||
$ cd build | ||
|
||
[ Unix* Libraries ] | ||
$ cmake -DCMAKE_C_COMPILER=<C Compiler> -DCMAKE_CXX_COMPILER=<C++ Compiler> .. | ||
|
||
$ make | ||
$ make install | ||
|
||
=========== | ||
Tests | ||
=========== | ||
After the library has been built, there are optional tests that can be | ||
performed. Some will be skipped based upon the platform. | ||
To run the tests, | ||
$ make check-libomptarget | ||
|
||
============= | ||
CMake options | ||
============= | ||
-DCMAKE_C_COMPILER=<C compiler name> | ||
Specify the C compiler | ||
|
||
-DCMAKE_CXX_COMPILER=<C++ compiler name> | ||
Specify the C++ compiler | ||
|
||
==== First values listed are the default value ==== | ||
-DCMAKE_BUILD_TYPE=Release|Debug|RelWithDebInfo | ||
Build type can be Release, Debug, or RelWithDebInfo. | ||
|
||
-DLIBOMPTARGET_ENABLE_WERROR=true|false | ||
Should consider warnings as errors. | ||
|
||
-DLIBOMPTARGET_LLVM_LIT_EXECUTABLE="" | ||
Full path to the llvm-lit tool. Required for testing in out-of-tree builds. | ||
|
||
-DLIBOMPTARGET_FILECHECK_EXECUTABLE="" | ||
Full path to the FileCheck tool. Required for testing in out-of-tree builds. | ||
|
||
-DLIBOMPTARGET_OPENMP_HEADER_FOLDER="" | ||
Path of the folder that contains omp.h. This is required for testing | ||
out-of-tree builds. | ||
|
||
-DLIBOMPTARGET_OPENMP_HOST_RTL_FOLDER="" | ||
Path of the folder that contains libomp.so. This is required for testing | ||
out-of-tree builds. | ||
|
||
==== NVPTX device RTL specific ==== | ||
-DLIBOMPTARGET_NVPTX_ENABLE_BCLIB=false|true | ||
Enable CUDA LLVM bitcode offloading device RTL. This is used for | ||
link time optimization of the omp runtime and application code. | ||
|
||
-DLIBOMPTARGET_NVPTX_CUDA_COMPILER=<CUDA compiler name> | ||
Location of a CUDA compiler capable of emitting LLVM bitcode. | ||
Currently only the Clang compiler is supported. This is only used | ||
when building the CUDA LLVM bitcode offloading device RTL. If | ||
unspecified, the default paths are inspected. | ||
|
||
-DLIBOMPTARGET_NVPTX_BC_LINKER=<LLVM bitcode linker> | ||
Location of a linker capable of linking LLVM bitcode objects. | ||
This is only used when building the CUDA LLVM bitcode offloading | ||
device RTL. If unspecified, the default paths are inspected. | ||
|
||
-DLIBOMPTARGET_NVPTX_ALTERNATE_HOST_COMPILER="" | ||
Host compiler to use with NVCC. This compiler is not going to be used to produce | ||
any binary. Instead, this is used to overcome the input compiler checks done by | ||
NVCC. E.g. if using a default host compiler that is not compatible with NVCC, | ||
this option can be use to pass to NVCC a valid compiler to avoid the error. | ||
|
||
-DLIBOMPTARGET_NVPTX_COMPUTE_CAPABILITY="35" | ||
Comma-separated list of CUDA compute capabilities that should be supported by | ||
the NVPTX device RTL. E.g. for compute capabilities 3.0 and 3.5, the option | ||
"30,35" should be used. | ||
|
||
======================= | ||
Example usages of CMake | ||
======================= | ||
---- Typical usage ---- | ||
cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ .. | ||
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. | ||
|
||
---- Request an NVPTX runtime library that supports compute capability 5.0 ---- | ||
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBOMPTARGET_NVPTX_COMPUTE_CAPABILITY="50" | ||
|
||
========= | ||
Footnotes | ||
========= | ||
[*] Other names and brands may be claimed as the property of others. |
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,115 @@ | ||
##===----------------------------------------------------------------------===## | ||
# | ||
# The LLVM Compiler Infrastructure | ||
# | ||
# This file is dual licensed under the MIT and the University of Illinois Open | ||
# Source Licenses. See LICENSE.txt for details. | ||
# | ||
##===----------------------------------------------------------------------===## | ||
# | ||
# Build offloading library libomptarget.so. | ||
# | ||
##===----------------------------------------------------------------------===## | ||
|
||
# CMAKE libomptarget | ||
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) | ||
|
||
# Add cmake directory to search for custom cmake functions. | ||
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules ${CMAKE_MODULE_PATH}) | ||
|
||
# Standalone build or part of LLVM? | ||
set(LIBOMPTARGET_STANDALONE_BUILD FALSE) | ||
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}" OR | ||
"${CMAKE_SOURCE_DIR}/libomptarget" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") | ||
project(libomptarget C CXX) | ||
set(LIBOMPTARGET_STANDALONE_BUILD TRUE) | ||
endif() | ||
|
||
|
||
if(${LIBOMPTARGET_STANDALONE_BUILD}) | ||
set(LIBOMPTARGET_ENABLE_WERROR FALSE CACHE BOOL | ||
"Enable -Werror flags to turn warnings into errors for supporting compilers.") | ||
# CMAKE_BUILD_TYPE was not defined, set default to Release | ||
if(NOT CMAKE_BUILD_TYPE) | ||
set(CMAKE_BUILD_TYPE Release) | ||
endif() | ||
set(LIBOMPTARGET_LIBDIR_SUFFIX "" CACHE STRING | ||
"suffix of lib installation directory, e.g. 64 => lib64") | ||
else() | ||
set(LIBOMPTARGET_ENABLE_WERROR ${LLVM_ENABLE_WERROR}) | ||
# If building in tree, we honor the same install suffix LLVM uses. | ||
set(LIBOMPTARGET_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX}) | ||
endif() | ||
|
||
# Compiler flag checks. | ||
include(config-ix) | ||
|
||
# Message utilities. | ||
include(LibomptargetUtils) | ||
|
||
# Get dependencies for the different components of the project. | ||
include(LibomptargetGetDependencies) | ||
|
||
# This is a list of all the targets that are supported/tested right now. | ||
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} powerpc64le-ibm-linux-gnu") | ||
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} powerpc64-ibm-linux-gnu") | ||
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} x86_64-pc-linux-gnu") | ||
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda") | ||
|
||
# Once the plugins for the different targets are validated, they will be added to | ||
# the list of supported targets in the current system. | ||
set (LIBOMPTARGET_SYSTEM_TARGETS "") | ||
|
||
# Set base directories - required for lit to locate the tests. | ||
set(LIBOMPTARGET_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) | ||
set(LIBOMPTARGET_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) | ||
|
||
# We need C++11 support. | ||
if(LIBOMPTARGET_HAVE_STD_CPP11_FLAG) | ||
|
||
libomptarget_say("Building offloading runtime library libomptarget.") | ||
|
||
# Enable support for C++11. | ||
add_definitions(-std=c++11) | ||
|
||
if(LIBOMPTARGET_ENABLE_WERROR AND LIBOMPTARGET_HAVE_WERROR_FLAG) | ||
add_definitions(-Werror) | ||
endif() | ||
|
||
# If building this library in debug mode, we define a macro to enable | ||
# dumping progress messages at runtime. | ||
string( TOLOWER "${CMAKE_BUILD_TYPE}" LIBOMPTARGET_CMAKE_BUILD_TYPE) | ||
if(LIBOMPTARGET_CMAKE_BUILD_TYPE MATCHES debug) | ||
add_definitions(-DOMPTARGET_DEBUG) | ||
add_definitions(-g) | ||
add_definitions(-O0) | ||
endif() | ||
|
||
set(src_files | ||
src/omptarget.cpp | ||
) | ||
|
||
include_directories(src/) | ||
|
||
# Build libomptarget library with libdl dependency. | ||
add_library(omptarget SHARED ${src_files}) | ||
target_link_libraries(omptarget | ||
dl | ||
"-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/exports") | ||
|
||
# Install libomptarget under the lib destination folder. | ||
install(TARGETS omptarget LIBRARY DESTINATION lib${LIBOMPTARGET_LIBDIR_SUFFIX}) | ||
|
||
# Retrieve the path to the resulting library so that it can be used for | ||
# testing. | ||
get_target_property(LIBOMPTARGET_LIBRARY_DIR omptarget LIBRARY_OUTPUT_DIRECTORY) | ||
if(NOT LIBOMPTARGET_LIBRARY_DIR) | ||
set(LIBOMPTARGET_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) | ||
endif() | ||
|
||
# Add tests. | ||
add_subdirectory(test) | ||
|
||
else(LIBOMPTARGET_HAVE_STD_CPP11_FLAG) | ||
libomptarget_say("Not building offloading runtime library libomptarget: host compiler must have c++11 support.") | ||
endif(LIBOMPTARGET_HAVE_STD_CPP11_FLAG) |
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,72 @@ | ||
|
||
README for the LLVM* OpenMP* Offloading Runtime Library (libomptarget) | ||
====================================================================== | ||
|
||
How to Build the LLVM* OpenMP* Offloading Runtime Library (libomptarget) | ||
======================================================================== | ||
In-tree build: | ||
|
||
$ cd where-you-want-to-live | ||
Check out openmp (libomptarget lives under ./libomptarget) into llvm/projects | ||
$ cd where-you-want-to-build | ||
$ mkdir build && cd build | ||
$ cmake path/to/llvm -DCMAKE_C_COMPILER=<C compiler> -DCMAKE_CXX_COMPILER=<C++ compiler> | ||
$ make omptarget | ||
|
||
Out-of-tree build: | ||
|
||
$ cd where-you-want-to-live | ||
Check out openmp (libomptarget lives under ./libomptarget) | ||
$ cd where-you-want-to-live/openmp/libomptarget | ||
$ mkdir build && cd build | ||
$ cmake path/to/openmp -DCMAKE_C_COMPILER=<C compiler> -DCMAKE_CXX_COMPILER=<C++ compiler> | ||
$ make | ||
|
||
For details about building, please look at Build_With_CMake.txt | ||
|
||
Architectures Supported | ||
======================= | ||
The current library has been only tested in Linux operating system and the | ||
following host architectures: | ||
* Intel(R) 64 architecture | ||
* IBM(R) Power architecture (big endian) | ||
* IBM(R) Power architecture (little endian) | ||
|
||
The currently supported offloading device architectures are: | ||
* Intel(R) 64 architecture (generic 64-bit plugin - mostly for testing purposes) | ||
* IBM(R) Power architecture (big endian) (generic 64-bit plugin - mostly for testing purposes) | ||
* IBM(R) Power architecture (little endian) (generic 64-bit plugin - mostly for testing purposes) | ||
* CUDA(R) enabled 64-bit NVIDIA(R) GPU architectures | ||
|
||
Supported RTL Build Configurations | ||
================================== | ||
Supported Architectures: Intel(R) 64, IBM(R) Power 7 and Power 8 | ||
|
||
--------------------------- | ||
| gcc | clang | | ||
--------------|------------|------------| | ||
| Linux* OS | Yes(1) | Yes(2) | | ||
----------------------------------------- | ||
|
||
(1) gcc version 4.8.2 or later is supported. | ||
(2) clang version 3.7 or later is supported. | ||
|
||
|
||
Front-end Compilers that work with this RTL | ||
=========================================== | ||
|
||
The following compilers are known to do compatible code generation for | ||
this RTL: | ||
- clang (from https://github.com/clang-ykt ) | ||
- clang (development branch at http://clang.llvm.org - several features still | ||
under development) | ||
|
||
----------------------------------------------------------------------- | ||
|
||
Notices | ||
======= | ||
This library and related compiler support is still under development, so the | ||
employed interface is likely to change in the future. | ||
|
||
*Other names and brands may be claimed as the property of others. | ||
|
124 changes: 124 additions & 0 deletions
124
openmp/libomptarget/cmake/Modules/LibomptargetGetDependencies.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,124 @@ | ||
# | ||
#//===----------------------------------------------------------------------===// | ||
#// | ||
#// The LLVM Compiler Infrastructure | ||
#// | ||
#// This file is dual licensed under the MIT and the University of Illinois Open | ||
#// Source Licenses. See LICENSE.txt for details. | ||
#// | ||
#//===----------------------------------------------------------------------===// | ||
# | ||
|
||
# Try to detect in the system several dependencies required by the different | ||
# components of libomptarget. These are the dependencies we have: | ||
# | ||
# libelf : required by some targets to handle the ELF files at runtime. | ||
# libffi : required to launch target kernels given function and argument | ||
# pointers. | ||
# CUDA : required to control offloading to NVIDIA GPUs. | ||
|
||
include (FindPackageHandleStandardArgs) | ||
|
||
################################################################################ | ||
# Looking for libelf... | ||
################################################################################ | ||
|
||
find_path ( | ||
LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR | ||
NAMES | ||
libelf.h | ||
PATHS | ||
/usr/include | ||
/usr/local/include | ||
/opt/local/include | ||
/sw/include | ||
ENV CPATH | ||
PATH_SUFFIXES | ||
libelf) | ||
|
||
find_library ( | ||
LIBOMPTARGET_DEP_LIBELF_LIBRARIES | ||
NAMES | ||
elf | ||
PATHS | ||
/usr/lib | ||
/usr/local/lib | ||
/opt/local/lib | ||
/sw/lib | ||
ENV LIBRARY_PATH | ||
ENV LD_LIBRARY_PATH) | ||
|
||
set(LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS ${LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR}) | ||
find_package_handle_standard_args( | ||
LIBOMPTARGET_DEP_LIBELF | ||
DEFAULT_MSG | ||
LIBOMPTARGET_DEP_LIBELF_LIBRARIES | ||
LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS) | ||
|
||
mark_as_advanced( | ||
LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS | ||
LIBOMPTARGET_DEP_LIBELF_LIBRARIES) | ||
|
||
################################################################################ | ||
# Looking for libffi... | ||
################################################################################ | ||
find_package(PkgConfig) | ||
|
||
pkg_check_modules(LIBOMPTARGET_SEARCH_LIBFFI QUIET libffi) | ||
|
||
find_path ( | ||
LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIR | ||
NAMES | ||
ffi.h | ||
HINTS | ||
${LIBOMPTARGET_SEARCH_LIBFFI_INCLUDEDIR} | ||
${LIBOMPTARGET_SEARCH_LIBFFI_INCLUDE_DIRS} | ||
PATHS | ||
/usr/include | ||
/usr/local/include | ||
/opt/local/include | ||
/sw/include | ||
ENV CPATH) | ||
|
||
# Don't bother look for the library if the header files were not found. | ||
if (LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIR) | ||
find_library ( | ||
LIBOMPTARGET_DEP_LIBFFI_LIBRARIES | ||
NAMES | ||
ffi | ||
HINTS | ||
${LIBOMPTARGET_SEARCH_LIBFFI_LIBDIR} | ||
${LIBOMPTARGET_SEARCH_LIBFFI_LIBRARY_DIRS} | ||
PATHS | ||
/usr/lib | ||
/usr/local/lib | ||
/opt/local/lib | ||
/sw/lib | ||
ENV LIBRARY_PATH | ||
ENV LD_LIBRARY_PATH) | ||
endif() | ||
|
||
set(LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIRS ${LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIR}) | ||
find_package_handle_standard_args( | ||
LIBOMPTARGET_DEP_LIBFFI | ||
DEFAULT_MSG | ||
LIBOMPTARGET_DEP_LIBFFI_LIBRARIES | ||
LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIRS) | ||
|
||
mark_as_advanced( | ||
LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIRS | ||
LIBOMPTARGET_DEP_LIBFFI_LIBRARIES) | ||
|
||
################################################################################ | ||
# Looking for CUDA... | ||
################################################################################ | ||
find_package(CUDA QUIET) | ||
|
||
set(LIBOMPTARGET_DEP_CUDA_FOUND ${CUDA_FOUND}) | ||
set(LIBOMPTARGET_DEP_CUDA_LIBRARIES ${CUDA_LIBRARIES}) | ||
set(LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS}) | ||
|
||
mark_as_advanced( | ||
LIBOMPTARGET_DEP_CUDA_FOUND | ||
LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS | ||
LIBOMPTARGET_DEP_CUDA_LIBRARIES) |
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,28 @@ | ||
# | ||
#//===----------------------------------------------------------------------===// | ||
#// | ||
#// The LLVM Compiler Infrastructure | ||
#// | ||
#// This file is dual licensed under the MIT and the University of Illinois Open | ||
#// Source Licenses. See LICENSE.txt for details. | ||
#// | ||
#//===----------------------------------------------------------------------===// | ||
# | ||
|
||
# void libomptarget_say(string message_to_user); | ||
# - prints out message_to_user | ||
macro(libomptarget_say message_to_user) | ||
message(STATUS "LIBOMPTARGET: ${message_to_user}") | ||
endmacro() | ||
|
||
# void libomptarget_warning_say(string message_to_user); | ||
# - prints out message_to_user with a warning | ||
macro(libomptarget_warning_say message_to_user) | ||
message(WARNING "LIBOMPTARGET: ${message_to_user}") | ||
endmacro() | ||
|
||
# void libomptarget_error_say(string message_to_user); | ||
# - prints out message_to_user with an error and exits cmake | ||
macro(libomptarget_error_say message_to_user) | ||
message(FATAL_ERROR "LIBOMPTARGET: ${message_to_user}") | ||
endmacro() |
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,17 @@ | ||
# | ||
#//===----------------------------------------------------------------------===// | ||
#// | ||
#// The LLVM Compiler Infrastructure | ||
#// | ||
#// This file is dual licensed under the MIT and the University of Illinois Open | ||
#// Source Licenses. See LICENSE.txt for details. | ||
#// | ||
#//===----------------------------------------------------------------------===// | ||
# | ||
|
||
include(CheckCCompilerFlag) | ||
include(CheckCXXCompilerFlag) | ||
|
||
# Checking C, CXX | ||
check_cxx_compiler_flag(-std=c++11 LIBOMPTARGET_HAVE_STD_CPP11_FLAG) | ||
check_c_compiler_flag(-Werror LIBOMPTARGET_HAVE_WERROR_FLAG) |
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,28 @@ | ||
VERS1.0 { | ||
global: | ||
__tgt_register_lib; | ||
__tgt_unregister_lib; | ||
__tgt_target_data_begin; | ||
__tgt_target_data_end; | ||
__tgt_target_data_update; | ||
__tgt_target; | ||
__tgt_target_teams; | ||
__tgt_target_data_begin_nowait; | ||
__tgt_target_data_end_nowait; | ||
__tgt_target_data_update_nowait; | ||
__tgt_target_nowait; | ||
__tgt_target_teams_nowait; | ||
omp_get_num_devices; | ||
omp_get_initial_device; | ||
omp_target_alloc; | ||
omp_target_free; | ||
omp_target_is_present; | ||
omp_target_memcpy; | ||
omp_target_memcpy_rect; | ||
omp_target_associate_ptr; | ||
omp_target_disassociate_ptr; | ||
__kmpc_push_target_tripcount; | ||
local: | ||
*; | ||
}; | ||
|
Large diffs are not rendered by default.
Oops, something went wrong.
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,234 @@ | ||
//===-------- omptarget.h - Target independent OpenMP target RTL -- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is dual licensed under the MIT and the University of Illinois Open | ||
// Source Licenses. See LICENSE.txt for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Interface to be used by Clang during the codegen of a | ||
// target region. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef _OMPTARGET_H_ | ||
#define _OMPTARGET_H_ | ||
|
||
#include <stdint.h> | ||
|
||
#define OFFLOAD_SUCCESS (0) | ||
#define OFFLOAD_FAIL (~0) | ||
|
||
#define OFFLOAD_DEVICE_DEFAULT -1 | ||
#define OFFLOAD_DEVICE_CONSTRUCTOR -2 | ||
#define OFFLOAD_DEVICE_DESTRUCTOR -3 | ||
#define HOST_DEVICE -10 | ||
|
||
/// Data attributes for each data reference used in an OpenMP target region. | ||
enum tgt_map_type { | ||
// No flags | ||
OMP_TGT_MAPTYPE_NONE = 0x000, | ||
// copy data from host to device | ||
OMP_TGT_MAPTYPE_TO = 0x001, | ||
// copy data from device to host | ||
OMP_TGT_MAPTYPE_FROM = 0x002, | ||
// copy regardless of the reference count | ||
OMP_TGT_MAPTYPE_ALWAYS = 0x004, | ||
// force unmapping of data | ||
OMP_TGT_MAPTYPE_DELETE = 0x008, | ||
// map the pointer as well as the pointee | ||
OMP_TGT_MAPTYPE_PTR_AND_OBJ = 0x010, | ||
// pass device base address to kernel | ||
OMP_TGT_MAPTYPE_TARGET_PARAM = 0x020, | ||
// return base device address of mapped data | ||
OMP_TGT_MAPTYPE_RETURN_PARAM = 0x040, | ||
// private variable - not mapped | ||
OMP_TGT_MAPTYPE_PRIVATE = 0x080, | ||
// copy by value - not mapped | ||
OMP_TGT_MAPTYPE_LITERAL = 0x100, | ||
// mapping is implicit | ||
OMP_TGT_MAPTYPE_IMPLICIT = 0x200, | ||
// member of struct, member given by 4 MSBs - 1 | ||
OMP_TGT_MAPTYPE_MEMBER_OF = 0xffff000000000000 | ||
}; | ||
|
||
enum OpenMPOffloadingDeclareTargetFlags { | ||
/// Mark the entry as having a 'link' attribute. | ||
OMP_DECLARE_TARGET_LINK = 0x01, | ||
/// Mark the entry as being a global constructor. | ||
OMP_DECLARE_TARGET_CTOR = 0x02, | ||
/// Mark the entry as being a global destructor. | ||
OMP_DECLARE_TARGET_DTOR = 0x04 | ||
}; | ||
|
||
/// This struct is a record of an entry point or global. For a function | ||
/// entry point the size is expected to be zero | ||
struct __tgt_offload_entry { | ||
void *addr; // Pointer to the offload entry info (function or global) | ||
char *name; // Name of the function or global | ||
size_t size; // Size of the entry info (0 if it is a function) | ||
int32_t flags; // Flags associated with the entry, e.g. 'link'. | ||
int32_t reserved; // Reserved, to be used by the runtime library. | ||
}; | ||
|
||
/// This struct is a record of the device image information | ||
struct __tgt_device_image { | ||
void *ImageStart; // Pointer to the target code start | ||
void *ImageEnd; // Pointer to the target code end | ||
__tgt_offload_entry *EntriesBegin; // Begin of table with all target entries | ||
__tgt_offload_entry *EntriesEnd; // End of table (non inclusive) | ||
}; | ||
|
||
/// This struct is a record of all the host code that may be offloaded to a | ||
/// target. | ||
struct __tgt_bin_desc { | ||
int32_t NumDeviceImages; // Number of device types supported | ||
__tgt_device_image *DeviceImages; // Array of device images (1 per dev. type) | ||
__tgt_offload_entry *HostEntriesBegin; // Begin of table with all host entries | ||
__tgt_offload_entry *HostEntriesEnd; // End of table (non inclusive) | ||
}; | ||
|
||
/// This struct contains the offload entries identified by the target runtime | ||
struct __tgt_target_table { | ||
__tgt_offload_entry *EntriesBegin; // Begin of the table with all the entries | ||
__tgt_offload_entry | ||
*EntriesEnd; // End of the table with all the entries (non inclusive) | ||
}; | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
// Implemented in libomp, they are called from within __tgt_* functions. | ||
int omp_get_default_device(void) __attribute__((weak)); | ||
int32_t __kmpc_omp_taskwait(void *loc_ref, int32_t gtid) __attribute__((weak)); | ||
|
||
int omp_get_num_devices(void); | ||
int omp_get_initial_device(void); | ||
void *omp_target_alloc(size_t size, int device_num); | ||
void omp_target_free(void *device_ptr, int device_num); | ||
int omp_target_is_present(void *ptr, int device_num); | ||
int omp_target_memcpy(void *dst, void *src, size_t length, size_t dst_offset, | ||
size_t src_offset, int dst_device, int src_device); | ||
int omp_target_memcpy_rect(void *dst, void *src, size_t element_size, | ||
int num_dims, const size_t *volume, const size_t *dst_offsets, | ||
const size_t *src_offsets, const size_t *dst_dimensions, | ||
const size_t *src_dimensions, int dst_device, int src_device); | ||
int omp_target_associate_ptr(void *host_ptr, void *device_ptr, size_t size, | ||
size_t device_offset, int device_num); | ||
int omp_target_disassociate_ptr(void *host_ptr, int device_num); | ||
|
||
/// adds a target shared library to the target execution image | ||
void __tgt_register_lib(__tgt_bin_desc *desc); | ||
|
||
/// removes a target shared library from the target execution image | ||
void __tgt_unregister_lib(__tgt_bin_desc *desc); | ||
|
||
// creates the host to target data mapping, stores it in the | ||
// libomptarget.so internal structure (an entry in a stack of data maps) and | ||
// passes the data to the device; | ||
void __tgt_target_data_begin(int32_t device_id, int32_t arg_num, | ||
void **args_base, void **args, int64_t *arg_sizes, | ||
int32_t *arg_types); | ||
void __tgt_target_data_begin_nowait(int32_t device_id, int32_t arg_num, | ||
void **args_base, void **args, | ||
int64_t *arg_sizes, int32_t *arg_types, | ||
int32_t depNum, void *depList, | ||
int32_t noAliasDepNum, | ||
void *noAliasDepList); | ||
|
||
// passes data from the target, release target memory and destroys the | ||
// host-target mapping (top entry from the stack of data maps) created by | ||
// the last __tgt_target_data_begin | ||
void __tgt_target_data_end(int32_t device_id, int32_t arg_num, void **args_base, | ||
void **args, int64_t *arg_sizes, int32_t *arg_types); | ||
void __tgt_target_data_end_nowait(int32_t device_id, int32_t arg_num, | ||
void **args_base, void **args, | ||
int64_t *arg_sizes, int32_t *arg_types, | ||
int32_t depNum, void *depList, | ||
int32_t noAliasDepNum, void *noAliasDepList); | ||
|
||
/// passes data to/from the target | ||
void __tgt_target_data_update(int32_t device_id, int32_t arg_num, | ||
void **args_base, void **args, int64_t *arg_sizes, | ||
int32_t *arg_types); | ||
void __tgt_target_data_update_nowait(int32_t device_id, int32_t arg_num, | ||
void **args_base, void **args, | ||
int64_t *arg_sizes, int32_t *arg_types, | ||
int32_t depNum, void *depList, | ||
int32_t noAliasDepNum, | ||
void *noAliasDepList); | ||
|
||
// Performs the same actions as data_begin in case arg_num is non-zero | ||
// and initiates run of offloaded region on target platform; if arg_num | ||
// is non-zero after the region execution is done it also performs the | ||
// same action as data_end above. The following types are used; this | ||
// function returns 0 if it was able to transfer the execution to a | ||
// target and an int different from zero otherwise. | ||
int __tgt_target(int32_t device_id, void *host_ptr, int32_t arg_num, | ||
void **args_base, void **args, int64_t *arg_sizes, | ||
int32_t *arg_types); | ||
int __tgt_target_nowait(int32_t device_id, void *host_ptr, int32_t arg_num, | ||
void **args_base, void **args, int64_t *arg_sizes, | ||
int32_t *arg_types, int32_t depNum, void *depList, | ||
int32_t noAliasDepNum, void *noAliasDepList); | ||
|
||
int __tgt_target_teams(int32_t device_id, void *host_ptr, int32_t arg_num, | ||
void **args_base, void **args, int64_t *arg_sizes, | ||
int32_t *arg_types, int32_t num_teams, | ||
int32_t thread_limit); | ||
int __tgt_target_teams_nowait(int32_t device_id, void *host_ptr, | ||
int32_t arg_num, void **args_base, void **args, | ||
int64_t *arg_sizes, int32_t *arg_types, | ||
int32_t num_teams, int32_t thread_limit, | ||
int32_t depNum, void *depList, | ||
int32_t noAliasDepNum, void *noAliasDepList); | ||
void __kmpc_push_target_tripcount(int32_t device_id, uint64_t loop_tripcount); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#ifdef OMPTARGET_DEBUG | ||
#include <stdio.h> | ||
#define DEBUGP(prefix, ...) \ | ||
{ \ | ||
fprintf(stderr, "%s --> ", prefix); \ | ||
fprintf(stderr, __VA_ARGS__); \ | ||
} | ||
|
||
#include <inttypes.h> | ||
#define DPxMOD "0x%0*" PRIxPTR | ||
#define DPxPTR(ptr) ((int)(2*sizeof(uintptr_t))), ((uintptr_t) (ptr)) | ||
|
||
/* | ||
* To printf a pointer in hex with a fixed width of 16 digits and a leading 0x, | ||
* use printf("ptr=" DPxMOD "...\n", DPxPTR(ptr)); | ||
* | ||
* DPxMOD expands to: | ||
* "0x%0*" PRIxPTR | ||
* where PRIxPTR expands to an appropriate modifier for the type uintptr_t on a | ||
* specific platform, e.g. "lu" if uintptr_t is typedef'd as unsigned long: | ||
* "0x%0*lu" | ||
* | ||
* Ultimately, the whole statement expands to: | ||
* printf("ptr=0x%0*lu...\n", // the 0* modifier expects an extra argument | ||
* // specifying the width of the output | ||
* (int)(2*sizeof(uintptr_t)), // the extra argument specifying the width | ||
* // 8 digits for 32bit systems | ||
* // 16 digits for 64bit | ||
* (uintptr_t) ptr); | ||
*/ | ||
#else | ||
#define DEBUGP(prefix, ...) \ | ||
{} | ||
#endif | ||
|
||
#ifdef __cplusplus | ||
#define EXTERN extern "C" | ||
#else | ||
#define EXTERN extern | ||
#endif | ||
|
||
#endif // _OMPTARGET_H_ |
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,93 @@ | ||
# CMakeLists.txt file for unit testing OpenMP Library | ||
include(FindPythonInterp) | ||
include(CheckTypeSize) | ||
if(NOT PYTHONINTERP_FOUND) | ||
libomptarget_warning_say("Could not find Python.") | ||
libomptarget_warning_say("The check-libomptarget target will not be available!") | ||
return() | ||
endif() | ||
|
||
set(LIBOMPTARGET_TEST_CFLAGS "" CACHE STRING | ||
"Extra compiler flags to send to the test compiler") | ||
|
||
if(${LIBOMPTARGET_STANDALONE_BUILD}) | ||
# Make sure we can use the console pool for recent cmake and ninja > 1.5 | ||
if(CMAKE_VERSION VERSION_LESS 3.1.20141117) | ||
set(cmake_3_2_USES_TERMINAL) | ||
else() | ||
set(cmake_3_2_USES_TERMINAL USES_TERMINAL) | ||
endif() | ||
set(LIBOMPTARGET_TEST_C_COMPILER ${CMAKE_C_COMPILER} CACHE STRING | ||
"C compiler to use for testing OpenMP offloading library") | ||
set(LIBOMPTARGET_TEST_CXX_COMPILER ${CMAKE_CXX_COMPILER} CACHE STRING | ||
"C++ compiler to use for testing OpenMP offloading library") | ||
set(LIBOMPTARGET_TEST_OPENMP_FLAG -fopenmp CACHE STRING | ||
"OpenMP compiler flag to use for testing OpenMP offloading library") | ||
set(LIBOMPTARGET_LLVM_LIT_EXECUTABLE "" CACHE STRING | ||
"Path to llvm-lit") | ||
find_program(LIT_EXECUTABLE NAMES llvm-lit ${LIBOMPTARGET_LLVM_LIT_EXECUTABLE}) | ||
if(NOT LIT_EXECUTABLE) | ||
libomptarget_say("Cannot find llvm-lit.") | ||
libomptarget_say("Please put llvm-lit in your PATH or set LIBOMPTARGET_LLVM_LIT_EXECUTABLE to its full path") | ||
libomptarget_warning_say("The check-libomptarget target will not be available!") | ||
return() | ||
endif() | ||
|
||
set(LIBOMPTARGET_FILECHECK_EXECUTABLE "" CACHE STRING | ||
"Path to FileCheck") | ||
find_program(LIBOMPTARGET_FILECHECK NAMES FileCheck ${LIBOMPTARGET_FILECHECK_EXECUTABLE}) | ||
if(NOT LIBOMPTARGET_FILECHECK) | ||
libomptarget_say("Cannot find FileCheck.") | ||
libomptarget_say("Please put FileCheck in your PATH or set LIBOMPTARGET_FILECHECK_EXECUTABLE to its full path") | ||
libomptarget_warning_say("The check-libomptarget target will not be available!") | ||
return() | ||
endif() | ||
|
||
# Set lit arguments | ||
# The -j 1 lets the actual tests run with the entire machine. | ||
# We have one test thread that spawns the tests serially. This allows | ||
# Each test to use the entire machine. | ||
set(LIBOMPTARGET_LIT_ARGS_DEFAULT "-sv --show-unsupported --show-xfail -j 1") | ||
if(MSVC OR XCODE) | ||
set(LIBOMPTARGET_LIT_ARGS_DEFAULT "${LIBOMPTARGET_LIT_ARGS_DEFAULT} --no-progress-bar") | ||
endif() | ||
set(LIBOMPTARGET_LIT_ARGS "${LIBOMPTARGET_LIT_ARGS_DEFAULT}" CACHE STRING | ||
"Default options for lit") | ||
separate_arguments(LIBOMPTARGET_LIT_ARGS) | ||
add_custom_target(check-libomptarget | ||
COMMAND ${PYTHON_EXECUTABLE} ${LIT_EXECUTABLE} ${LIBOMPTARGET_LIT_ARGS} ${CMAKE_CURRENT_BINARY_DIR} | ||
DEPENDS omptarget | ||
COMMENT "Running libomptarget tests" | ||
${cmake_3_2_USES_TERMINAL} | ||
) | ||
|
||
set(LIBOMPTARGET_OPENMP_HEADER_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/../../runtime/src" CACHE STRING | ||
"Path to folder containing omp.h") | ||
set(LIBOMPTARGET_OPENMP_HOST_RTL_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/../../runtime/src" CACHE STRING | ||
"Path to folder containing libomp.so") | ||
else() | ||
# LLVM source tree build, test just-built clang | ||
if(NOT MSVC) | ||
set(LIBOMPTARGET_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) | ||
set(LIBOMPTARGET_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++) | ||
set(LIBOMPTARGET_FILECHECK ${LLVM_RUNTIME_OUTPUT_INTDIR}/FileCheck) | ||
else() | ||
libomptarget_warning_say("Not prepared to run tests on Windows systems.") | ||
endif() | ||
set(LIBOMPTARGET_TEST_OPENMP_FLAG -fopenmp=libomp) | ||
# Use add_lit_testsuite() from LLVM CMake. This also depends on OpenMP | ||
# implementation because it uses omp.h. | ||
add_lit_testsuite(check-libomptarget | ||
"Running libomptarget tests" | ||
${CMAKE_CURRENT_BINARY_DIR} | ||
ARGS "-j 1" | ||
DEPENDS omptarget omp | ||
) | ||
|
||
set(LIBOMPTARGET_OPENMP_HEADER_FOLDER "${LIBOMPTARGET_BINARY_DIR}/../runtime/src") | ||
endif() | ||
|
||
# Configure the lit.site.cfg.in file | ||
set(AUTO_GEN_COMMENT "## Autogenerated by libomptarget configuration.\n# Do not edit!") | ||
configure_file(lit.site.cfg.in lit.site.cfg @ONLY) | ||
|
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,116 @@ | ||
# -*- Python -*- vim: set ft=python ts=4 sw=4 expandtab tw=79: | ||
# Configuration file for the 'lit' test runner. | ||
|
||
import os | ||
import lit.formats | ||
|
||
# Tell pylint that we know config and lit_config exist somewhere. | ||
if 'PYLINT_IMPORT' in os.environ: | ||
config = object() | ||
lit_config = object() | ||
|
||
def append_dynamic_library_path(name, value, sep): | ||
if name in config.environment: | ||
config.environment[name] = value + sep + config.environment[name] | ||
else: | ||
config.environment[name] = value | ||
|
||
# name: The name of this test suite. | ||
config.name = 'libomptarget' | ||
|
||
# suffixes: A list of file extensions to treat as test files. | ||
config.suffixes = ['.c', '.cpp', '.cc'] | ||
|
||
# test_source_root: The root path where tests are located. | ||
config.test_source_root = os.path.dirname(__file__) | ||
|
||
# test_exec_root: The root object directory where output is placed | ||
config.test_exec_root = config.libomptarget_obj_root | ||
|
||
# test format | ||
config.test_format = lit.formats.ShTest() | ||
|
||
# compiler flags | ||
config.test_cflags = config.test_openmp_flag + \ | ||
" -I " + config.test_source_root + \ | ||
" -I " + config.omp_header_directory + \ | ||
" -L " + config.library_dir; | ||
|
||
if config.omp_host_rtl_directory: | ||
config.test_cflags = config.test_cflags + " -L " + \ | ||
config.omp_host_rtl_directory | ||
|
||
config.test_cflags = config.test_cflags + " " + config.test_extra_cflags | ||
|
||
# Setup environment to find dynamic library at runtime | ||
if config.operating_system == 'Windows': | ||
append_dynamic_library_path('PATH', config.library_dir, ";") | ||
append_dynamic_library_path('PATH', config.omp_host_rtl_directory, ";") | ||
elif config.operating_system == 'Darwin': | ||
append_dynamic_library_path('DYLD_LIBRARY_PATH', config.library_dir, ":") | ||
append_dynamic_library_path('DYLD_LIBRARY_PATH', \ | ||
config.omp_host_rtl_directory, ";") | ||
config.test_cflags += " -Wl,-rpath," + config.library_dir | ||
config.test_cflags += " -Wl,-rpath," + config.omp_host_rtl_directory | ||
else: # Unices | ||
append_dynamic_library_path('LD_LIBRARY_PATH', config.library_dir, ":") | ||
append_dynamic_library_path('LD_LIBRARY_PATH', \ | ||
config.omp_host_rtl_directory, ":") | ||
|
||
# substitutions | ||
# - for targets that exist in the system create the actual command. | ||
# - for valid targets that do not exist in the system, return false, so that the | ||
# same test can be used for different targets. | ||
|
||
# Scan all the valid targets. | ||
for libomptarget_target in config.libomptarget_all_targets: | ||
# Is this target in the current system? If so create a compile, run and test | ||
# command. Otherwise create command that return false. | ||
if libomptarget_target in config.libomptarget_system_targets: | ||
config.substitutions.append(("%libomptarget-compilexx-run-and-check-" + \ | ||
libomptarget_target, \ | ||
"%libomptarget-compilexx-and-run-" + libomptarget_target + \ | ||
" | " + config.libomptarget_filecheck + " %s")) | ||
config.substitutions.append(("%libomptarget-compile-run-and-check-" + \ | ||
libomptarget_target, \ | ||
"%libomptarget-compile-and-run-" + libomptarget_target + \ | ||
" | " + config.libomptarget_filecheck + " %s")) | ||
config.substitutions.append(("%libomptarget-compilexx-and-run-" + \ | ||
libomptarget_target, \ | ||
"%clangxx-" + libomptarget_target + " %s -o %t-" + \ | ||
libomptarget_target + " && %t-" + libomptarget_target)) | ||
config.substitutions.append(("%libomptarget-compile-and-run-" + \ | ||
libomptarget_target, \ | ||
"%clang-" + libomptarget_target + " %s -o %t-" + \ | ||
libomptarget_target + " && %t-" + libomptarget_target)) | ||
config.substitutions.append(("%clangxx-" + libomptarget_target, \ | ||
"%clangxx %cflags -fopenmp-targets=" + libomptarget_target)) | ||
config.substitutions.append(("%clang-" + libomptarget_target, \ | ||
"%clang %cflags -fopenmp-targets=" + libomptarget_target)) | ||
config.substitutions.append(("%fcheck-" + libomptarget_target, \ | ||
config.libomptarget_filecheck + " %s")) | ||
else: | ||
config.substitutions.append(("%libomptarget-compile-run-and-check-" + \ | ||
libomptarget_target, \ | ||
"echo ignored-command")) | ||
config.substitutions.append(("%libomptarget-compilexx-run-and-check-" + \ | ||
libomptarget_target, \ | ||
"echo ignored-command")) | ||
config.substitutions.append(("%libomptarget-compile-and-run-" + \ | ||
libomptarget_target, \ | ||
"echo ignored-command")) | ||
config.substitutions.append(("%libomptarget-compilexx-and-run-" + \ | ||
libomptarget_target, \ | ||
"echo ignored-command")) | ||
config.substitutions.append(("%clang-" + libomptarget_target, \ | ||
"echo ignored-command")) | ||
config.substitutions.append(("%clangxx-" + libomptarget_target, \ | ||
"echo ignored-command")) | ||
config.substitutions.append(("%fcheck-" + libomptarget_target, \ | ||
"echo ignored-command")) | ||
|
||
config.substitutions.append(("%clangxx", config.test_cxx_compiler)) | ||
config.substitutions.append(("%clang", config.test_c_compiler)) | ||
config.substitutions.append(("%openmp_flag", config.test_openmp_flag)) | ||
config.substitutions.append(("%cflags", config.test_cflags)) | ||
|
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,20 @@ | ||
@AUTO_GEN_COMMENT@ | ||
|
||
config.test_c_compiler = "@LIBOMPTARGET_TEST_C_COMPILER@" | ||
config.test_cxx_compiler = "@LIBOMPTARGET_TEST_CXX_COMPILER@" | ||
config.test_openmp_flag = "@LIBOMPTARGET_TEST_OPENMP_FLAG@" | ||
# For the moment we still need to pass libomptarget explicitly. Once the driver | ||
# patch, lands, this is not required anymore. | ||
config.test_extra_cflags = "-lomptarget @LIBOMPTARGET_TEST_CFLAGS@" | ||
config.libomptarget_obj_root = "@CMAKE_CURRENT_BINARY_DIR@" | ||
config.library_dir = "@LIBOMPTARGET_LIBRARY_DIR@" | ||
config.omp_header_directory = "@LIBOMPTARGET_OPENMP_HEADER_FOLDER@" | ||
config.omp_host_rtl_directory = "@LIBOMPTARGET_OPENMP_HOST_RTL_FOLDER@" | ||
config.operating_system = "@CMAKE_SYSTEM_NAME@" | ||
config.libomptarget_all_targets = "@LIBOMPTARGET_ALL_TARGETS@".split() | ||
config.libomptarget_system_targets = "@LIBOMPTARGET_SYSTEM_TARGETS@".split() | ||
config.libomptarget_filecheck = "@LIBOMPTARGET_FILECHECK@" | ||
|
||
# Let the main config do the real work. | ||
lit_config.load_config(config, "@LIBOMPTARGET_BASE_DIR@/test/lit.cfg") | ||
|
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,22 @@ | ||
// RUN: %libomptarget-compile-run-and-check-powerpc64-ibm-linux-gnu | ||
// RUN: %libomptarget-compile-run-and-check-powerpc64le-ibm-linux-gnu | ||
// RUN: %libomptarget-compile-run-and-check-x86_64-pc-linux-gnu | ||
|
||
#include <stdio.h> | ||
#include <omp.h> | ||
|
||
int main(void) { | ||
int isHost = -1; | ||
|
||
#pragma omp target | ||
{ isHost = omp_is_initial_device(); } | ||
|
||
if (isHost < 0) { | ||
printf("Runtime error, isHost=%d\n", isHost); | ||
} | ||
|
||
// CHECK: Target region executed on the device | ||
printf("Target region executed on the %s\n", isHost ? "host" : "device"); | ||
|
||
return isHost; | ||
} |
22 changes: 22 additions & 0 deletions
22
openmp/libomptarget/test/offloading/offloading_success.cpp
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,22 @@ | ||
// RUN: %libomptarget-compilexx-run-and-check-powerpc64-ibm-linux-gnu | ||
// RUN: %libomptarget-compilexx-run-and-check-powerpc64le-ibm-linux-gnu | ||
// RUN: %libomptarget-compilexx-run-and-check-x86_64-pc-linux-gnu | ||
|
||
#include <stdio.h> | ||
#include <omp.h> | ||
|
||
int main(void) { | ||
int isHost = 0; | ||
|
||
#pragma omp target | ||
{ isHost = omp_is_initial_device(); } | ||
|
||
if (isHost < 0) { | ||
printf("Runtime error, isHost=%d\n", isHost); | ||
} | ||
|
||
// CHECK: Target region executed on the device | ||
printf("Target region executed on the %s\n", isHost ? "host" : "device"); | ||
|
||
return isHost; | ||
} |