Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
367aa04
Frist attempt to make it run with LLVM 19
ilagunap Mar 26, 2025
bb8e06e
more tests passed - working on interceptor
ilagunap Mar 27, 2025
b3bc1ec
changes to verify it ran all tests in Tioga
ilagunap Mar 27, 2025
c290527
updates for MacOS and for exponent usage
ilagunap Apr 2, 2025
b628305
changes in printing hash table to remove warnings
ilagunap Apr 2, 2025
994b610
Added support for FMA checking and tests
ilagunap Apr 3, 2025
30091b3
added exp usage part of the report
ilagunap Apr 4, 2025
e29e5a2
fixed issues and added tests for exp usage
ilagunap Apr 4, 2025
76bb2b7
added a report test - all tests passing
ilagunap Apr 5, 2025
edd7ace
finish modifying the report (new icons and presentation)
ilagunap Apr 6, 2025
1bc8186
fixed the sprintf issue
ilagunap Apr 6, 2025
a81bd62
modified CMakeLists.txt
ilagunap Apr 6, 2025
b789cc2
added LU solver for the tutorial
ilagunap Apr 12, 2025
128f96a
added example_1
ilagunap Apr 13, 2025
a47def0
added example 2
ilagunap Apr 19, 2025
ff121d7
modified example 2
ilagunap Apr 19, 2025
00209d0
Added FEM example
ilagunap Apr 21, 2025
937c275
changes to example 3
ilagunap Apr 22, 2025
15102cb
Fixes to example 3 (before converting to mixed precision)
ilagunap Apr 23, 2025
13c2cd8
Fixed bug on exponent printing where exponent was zero
ilagunap Apr 23, 2025
a1519a0
added example 4 on solving PDE and instability
ilagunap Apr 24, 2025
54324e1
fixed bugs in Hashtable and exp-usage tests
ilagunap Apr 25, 2025
295438e
Added block and funcion annotations
ilagunap Apr 27, 2025
a110e86
added tutorial examples
ilagunap May 1, 2025
3efa761
deleted some reports
ilagunap May 1, 2025
5250b6f
added conda env spec in tutorial
ilagunap May 2, 2025
ba4c0bf
added superlu example
ilagunap May 5, 2025
f5c50bf
fftw example
ilagunap May 8, 2025
f2b12d6
conda file
ilagunap May 8, 2025
ced220e
small fixes
ilagunap May 8, 2025
fa57e37
added show program
ilagunap May 10, 2025
5bff166
fixes to show program
ilagunap May 10, 2025
3da0873
added show program test
ilagunap May 10, 2025
b171c7e
fixed some tests for Linux
ilagunap May 10, 2025
67f362e
fixe issue to find python3
ilagunap May 16, 2025
2fb62fe
test_fp32_precision
Jun 20, 2025
9410982
test case of adding small number to large values
Jun 20, 2025
d10ac73
cancellation test case
Jun 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,7 @@ main
.cache
.fpchecker/
.DS_Store
.fpc_log.txt
.vscode/
*.ipynb_checkpoints/
*.virtual_documents/*
191 changes: 127 additions & 64 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
cmake_minimum_required(VERSION 3.11)
cmake_minimum_required(VERSION 3.15)

set(CMAKE_CXX_COMPILER "clang++")
set(CMAKE_C_COMPILER "clang")

project(fpchecker VERSION 0.2.0 DESCRIPTION "FPChecker" LANGUAGES CXX C)
project(fpchecker VERSION 0.5 DESCRIPTION "FPChecker" LANGUAGES CXX C)

execute_process(COMMAND llvm-config --ldflags
OUTPUT_VARIABLE CMAKE_SHARED_LINKER_FLAGS
Expand All @@ -17,89 +17,148 @@ execute_process(COMMAND llvm-config --cppflags
OUTPUT_VARIABLE CMAKE_CPP_FLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE)

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -g -std=c++14 -DFPC_DEBUG")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -g -std=c++14")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -g -std=c++17")

include(GNUInstallDirs)
include(CheckLanguage)

###################################
## Check for python3 and packages #
###################################
find_package(Python3 REQUIRED COMPONENTS Interpreter)

if(Python3_FOUND AND Python3_Interpreter_FOUND)
message(STATUS "Found Python3: ${Python3_EXECUTABLE}")

# Define a variable for the package name
set(PYTHON_PACKAGE_NAME "matplotlib")

message(STATUS "Checking for Python package: ${PYTHON_PACKAGE_NAME}")

# Script to check for the package
set(PYTHON_CHECK_SCRIPT
"import sys\ntry:\n import ${PYTHON_PACKAGE_NAME}\n sys.exit(0)\nexcept ImportError:\n sys.stderr.write('Python package \\'${PYTHON_PACKAGE_NAME}\\' not found.')\n sys.exit(1)\n"
)

# Execute the Python script
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "${PYTHON_CHECK_SCRIPT}"
RESULT_VARIABLE PYTHON_PACKAGE_CHECK_RESULT
OUTPUT_VARIABLE PYTHON_PACKAGE_CHECK_OUTPUT
ERROR_VARIABLE PYTHON_PACKAGE_CHECK_ERROR
)

# Check the result of the execution
if(NOT PYTHON_PACKAGE_CHECK_RESULT EQUAL 0)
message(NOTICE "Could not find the Python package '${PYTHON_PACKAGE_NAME}'.\n${PYTHON_PACKAGE_CHECK_ERROR}")
message(WARNING "Python3 and matplotlib are required to create reports.")
else()
message(STATUS "Python package '${PYTHON_PACKAGE_NAME}' found.")
endif()

else()
message(WARNING "Python3 not found. Python3 and matplotlib are required to create reports.")
endif()

###### Enable testing ##########
#set(ENV{PATH} "${CMAKE_INSTALL_PREFIX}/bin:$ENV{PATH}")
enable_testing()
include(CTest)
find_package(Python3 COMPONENTS Interpreter)
if(Python3_Interpreter_FOUND)
#find_package(Python3 COMPONENTS Interpreter)
#if(Python3_Interpreter_FOUND)
add_test(NAME cpu-tests COMMAND Python3::Interpreter -m pytest --tb=no
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests/cpu_checking)
set_tests_properties(cpu-tests PROPERTIES ENVIRONMENT "PATH=${CMAKE_INSTALL_PREFIX}/bin:$ENV{PATH}")

check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
add_test(NAME nvcc-tests COMMAND Python3::Interpreter -m pytest --tb=no
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests/parser)
set_tests_properties(nvcc-tests PROPERTIES ENVIRONMENT "PATH=${CMAKE_INSTALL_PREFIX}/bin:$ENV{PATH}")

endif()
endif()
#endif()
###############################

# Set Path pf wrappers in config file
set(NVCC_WRAPPER "${CMAKE_INSTALL_PREFIX}/bin/nvcc-fpchecker")
#set(NVCC_WRAPPER "${CMAKE_INSTALL_PREFIX}/bin/nvcc-fpchecker")
set(CLANG_WRAPPER "${CMAKE_INSTALL_PREFIX}/bin/clang-fpchecker")
set(CLANGPP_WRAPPER "${CMAKE_INSTALL_PREFIX}/bin/clang++-fpchecker")
set(MPI_WRAPPER "${CMAKE_INSTALL_PREFIX}/bin/mpicc-fpchecker")
set(MPIPP_WRAPPER "${CMAKE_INSTALL_PREFIX}/bin/mpicxx-fpchecker")
configure_file(interception_tool/intercept.h.in intercept.h)

add_library(fpchecker SHARED
src/CodeMatching.cpp
src/Instrumentation.cpp
src/Logging.cpp
src/Utility.cpp
src/driver.cpp
)
# !!! We no longer builld the CUDA (old version) !!!
#add_library(fpchecker SHARED
# src/CodeMatching.cpp
# src/Instrumentation.cpp
# src/Logging.cpp
# src/Utility.cpp
# src/driver.cpp
#)

add_executable(fpchecker-show src/Show.cpp)

add_library(fpchecker_cpu SHARED
add_library(fpchecker_cpu SHARED
src/CodeMatching.cpp
src/Instrumentation_cpu.cpp
src/Logging.cpp
src/Utility.cpp
src/driver_cpu.cpp
)

add_library(fpchecker_plugin SHARED
plugin/instrumentation_plugin.cpp
)
#add_library(fpchecker_plugin SHARED
# plugin/instrumentation_plugin.cpp
#)

if(NOT APPLE)
add_library(fpchecker_intercept_lib SHARED
interception_tool/intercept.c
)

#set_target_properties(fpchecker_intercept_lib PROPERTIES LINKER_LANGUAGE C)
target_include_directories(fpchecker_intercept_lib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
endif()

if(APPLE)
TARGET_LINK_LIBRARIES(fpchecker "-undefined dynamic_lookup")
#TARGET_LINK_LIBRARIES(fpchecker "-undefined dynamic_lookup")
TARGET_LINK_LIBRARIES(fpchecker_cpu "-undefined dynamic_lookup")
TARGET_LINK_LIBRARIES(fpchecker_plugin "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
#TARGET_LINK_LIBRARIES(fpchecker_plugin "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
endif()

if(NOT APPLE)
TARGET_LINK_LIBRARIES(fpchecker_intercept_lib "-ldl")
endif()

set_target_properties(fpchecker PROPERTIES
set_target_properties(fpchecker_cpu PROPERTIES
VERSION ${PROJECT_VERSION}
)

target_include_directories(fpchecker PRIVATE src)
# Set extension of shared library
if(APPLE)
set(LIB_EXTENSION ".dylib")
else()
set(LIB_EXTENSION ".so")
endif()

target_compile_definitions(fpchecker-show
PRIVATE # This definition is only needed by this target itself
INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}"
SHARED_LIB_EXTENSION="${LIB_EXTENSION}"
)

#set_target_properties(fpchecker PROPERTIES
# VERSION ${PROJECT_VERSION}
#)

#target_include_directories(fpchecker PRIVATE src)

set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)

install(TARGETS fpchecker fpchecker_plugin fpchecker_intercept_lib fpchecker_cpu
if(APPLE)
install(TARGETS fpchecker_cpu
LIBRARY DESTINATION "lib64"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
else()
#install(TARGETS fpchecker fpchecker_plugin fpchecker_intercept_lib fpchecker_cpu
install(TARGETS fpchecker_intercept_lib fpchecker_cpu
LIBRARY DESTINATION "lib64"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
endif()

# Install link for /lib
install(CODE "execute_process( \
Expand All @@ -108,7 +167,8 @@ install(CODE "execute_process( \
COMMENT "Creating link: /lib --> /lib64"
)

install(FILES "src/Runtime.h" "src/Runtime_plugin.h" "src/Runtime_parser.h" "src/Runtime_cpu.h" "src/FPC_Hashtable.h"
#install(FILES "src/Runtime.h" "src/Runtime_plugin.h" "src/Runtime_parser.h" "src/Runtime_cpu.h" "src/FPC_Hashtable.h"
install(FILES "src/Runtime_cpu.h" "src/FPC_Hashtable.h"
DESTINATION "src"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ
)
Expand All @@ -120,21 +180,21 @@ install(FILES
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)

install(FILES
"parser/colors.py"
"parser/config_reader.py"
"parser/deprocess.py"
"parser/exceptions.py"
"parser/fpc-debug.py"
"parser/fpc_logging.py"
"parser/g++_fpchecker.py"
"parser/instrument.py"
"parser/match.py"
"parser/nvcc_fpchecker.py"
"parser/tokenizer.py"
DESTINATION front-end
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
#install(FILES
# "parser/colors.py"
# "parser/config_reader.py"
# "parser/deprocess.py"
# "parser/exceptions.py"
# "parser/fpc-debug.py"
# "parser/fpc_logging.py"
# "parser/g++_fpchecker.py"
# "parser/instrument.py"
# "parser/match.py"
# "parser/nvcc_fpchecker.py"
# "parser/tokenizer.py"
# DESTINATION front-end
# PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
#)

install(FILES
"cpu_checking/cc_mpi_frontend.sh"
Expand All @@ -148,13 +208,11 @@ install(FILES
"cpu_checking/fpc_logging.py"
"cpu_checking/line_highlighting.py"
"cpu_checking/mpicc_fpchecker.py"
"cpu_checking/histograms/fpc_create_exp_usage_report.py"
DESTINATION cpu_checking
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)

install(DIRECTORY "cpu_checking/report_templates/" DESTINATION cpu_checking/report_templates)
install(DIRECTORY "cpu_checking/histograms/report_templates/" DESTINATION cpu_checking/histograms/report_templates)

install(DIRECTORY
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
Expand All @@ -163,17 +221,17 @@ install(DIRECTORY
)

# Install link for fpchecker wrappers
install(CODE "execute_process( \
COMMAND ${CMAKE_COMMAND} -E create_symlink \
${CMAKE_INSTALL_PREFIX}/front-end/nvcc_fpchecker.py ${CMAKE_INSTALL_PREFIX}/bin/nvcc-fpc )"
COMMENT "Creating link: nvcc-fpc -> nvcc_fpchecker.py"
)
#install(CODE "execute_process( \
# COMMAND ${CMAKE_COMMAND} -E create_symlink \
# ${CMAKE_INSTALL_PREFIX}/front-end/nvcc_fpchecker.py ${CMAKE_INSTALL_PREFIX}/bin/nvcc-fpc )"
# COMMENT "Creating link: nvcc-fpc -> nvcc_fpchecker.py"
#)

install(CODE "execute_process( \
COMMAND ${CMAKE_COMMAND} -E create_symlink \
${CMAKE_INSTALL_PREFIX}/front-end/nvcc_fpchecker.py ${CMAKE_INSTALL_PREFIX}/bin/nvcc-fpchecker )"
COMMENT "Creating link: nvcc-fpchecker -> nvcc_fpchecker.py"
)
#install(CODE "execute_process( \
# COMMAND ${CMAKE_COMMAND} -E create_symlink \
# ${CMAKE_INSTALL_PREFIX}/front-end/nvcc_fpchecker.py ${CMAKE_INSTALL_PREFIX}/bin/nvcc-fpchecker )"
# COMMENT "Creating link: nvcc-fpchecker -> nvcc_fpchecker.py"
#)

# Install link for fpchecker reports tool
install(CODE "execute_process( \
Expand Down Expand Up @@ -234,8 +292,8 @@ install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink \
${CMAKE_INSTALL_PREFIX}/cpu_checking/cc_mpi_frontend.sh ${CMAKE_INSTALL_PREFIX}/bin/mpicc-fpchecker )"
)

install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink \
${CMAKE_INSTALL_PREFIX}/cpu_checking/fpc_create_exp_usage_report.py ${CMAKE_INSTALL_PREFIX}/bin/fpc-create-usage-report )"
install(TARGETS fpchecker-show
DESTINATION bin
)

# Tests
Expand All @@ -247,6 +305,11 @@ install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink \
#add_custom_target(tests COMMAND bash ${CMAKE_BINARY_DIR}/tests/tests.sh)
#find_package(Python3 COMPONENTS Interpreter)

if(DEFINED FPC_DEBUG AND "${FPC_DEBUG}" STREQUAL "ON")
message(STATUS "FPC_DEBUG definition is set to: ${FPC_DEBUG}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFPC_DEBUG")
endif()

message(STATUS "CMAKE_CXX_COMPILE_FLAGS: " ${CMAKE_CXX_COMPILE_FLAGS})
message(STATUS "CMAKE_CXX_COMPILER: " ${CMAKE_CXX_COMPILER})
message(STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS})
Expand Down
11 changes: 4 additions & 7 deletions Makefile.config
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
# Set LLVM_PATH here or in the environment
#export CLANG++=clang++-mp-9.0
#export CLANG=clang-mp-9.0
#export LLVM_CONFIG=/llvm-config
#export LLVM_PATH=/Users/lagunaperalt1/projects/applications/llvm/install-llvm-9.0.1
#export LLVM_PATH=/opt/local
export LLVM_PATH=/collab/usr/global/tools/fpchecker/llvm-12.0.0-install
#export LLVM_PATH=/collab/usr/global/tools/fpchecker/llvm-12.0.0-install
export LLVM_PATH=/opt/anaconda3/envs/llvm19

# C++ compiler
CXX = $(LLVM_PATH)/bin/clang++
Expand All @@ -14,12 +11,12 @@ CXX = $(LLVM_PATH)/bin/clang++
LLVM_CONFIG = $(LLVM_PATH)/bin/llvm-config
#LLVM_CONFIG = llvm-config-mp-12

APPLE_LDFLAGS =-Wl,-flat_namespace -Wl,-undefined -Wl,suppress
#APPLE_LDFLAGS =-Wl,-flat_namespace -Wl,-undefined -Wl,suppress

# Passed to compiler
SRC_DIR ?= $(PWD)
COMMON_FLAGS = -Wall -O3 -g -std=c++11
LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags) $(APPLE_LDFLAGS)
LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags) #$(APPLE_LDFLAGS)
CXXFLAGS += $(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags) -fPIC -DFPC_DEBUG
CPPFLAGS += $(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR)

Expand Down
4 changes: 3 additions & 1 deletion cpu_checking/clang_fpchecker.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
else:
FPCHECKER_LIB = FPCHECKER_PATH+'/../lib/libfpchecker_cpu.so'
FPCHECKER_RUNTIME = FPCHECKER_PATH+'/../src/Runtime_cpu.h'
LLVM_PASS = "-Xclang -load -Xclang " + FPCHECKER_LIB + " -include " + FPCHECKER_RUNTIME + ' -g '
#LLVM_PASS = "-Xclang -load -Xclang " + FPCHECKER_LIB + " -include " + FPCHECKER_RUNTIME + ' -g '
LLVM_PASS = "-fpass-plugin=" + FPCHECKER_LIB + " -include " + FPCHECKER_RUNTIME + ' -g '

# --------------------------------------------------------------------------- #
# --- Classes --------------------------------------------------------------- #
Expand Down Expand Up @@ -93,6 +94,7 @@ def instrumentIR(self):
compiler_name = os.environ['FPC_COMPILER']
params = os.environ['FPC_COMPILER_PARAMS']
cmd = Command(compiler_name, params.split())


if 'FPC_INSTRUMENT' not in os.environ:
cmd.executeOriginalCommand()
Expand Down
Loading