Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New CMake CUDA tools, better cross platform support #94

Open
wants to merge 61 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
3288bb7
updated 7z command in create package
ironictoo Aug 3, 2021
9038319
Fixed CUBLAS linking on linux, static and dynamic
ironictoo Jul 11, 2019
b6236ca
Merge branch 'master' of https://github.com/gpufit/Gpufit into linux_…
ironictoo Aug 10, 2021
95b136e
updated version in linus python install script
ironictoo Aug 10, 2021
5787df2
Added scripts for binary release, install, and testing in linux
ironictoo Aug 10, 2021
14f79f5
added linux python install script
ironictoo Aug 10, 2021
f283f45
updated file permissions on copy for linux python install
ironictoo Aug 10, 2021
8a0f845
use new cmake cuda tools, requires cmake 3.18
ironictoo Aug 12, 2021
efd1b08
Merge remote-tracking branch 'upstream/master' into cmake_update
ironictoo Jul 22, 2022
664420e
automated build with github actions (Windows only)
jimkring Oct 7, 2022
d289462
source folder is current directory
jimkring Oct 7, 2022
69dabd2
don't install visual_studio_integration subpackage on linux
jimkring Oct 7, 2022
5f3459b
call python not python.exe for cross-platform support
jimkring Oct 7, 2022
9b081f0
linux build improvements
jimkring Oct 7, 2022
d6218fb
fix linux Configure CMake
jimkring Oct 7, 2022
47fa46c
typo
jimkring Oct 7, 2022
8dba739
Linux build command is simply make
jimkring Oct 7, 2022
207d073
add conditionals
jimkring Oct 7, 2022
f41dd00
create build directory
jimkring Oct 7, 2022
979626d
fix paths
jimkring Oct 7, 2022
a6caf5f
linux cmake -DCMAKE_BUILD_TYPE=RELEASE
jimkring Oct 7, 2022
e9c2919
upload entire build folder
jimkring Oct 7, 2022
cead996
separate steps for windows and linux artifacts
jimkring Oct 7, 2022
c64e19d
fixed Linux artifact upload
jimkring Oct 8, 2022
081076b
Merge branch 'cmake_update' into pr_build_action
ironictoo Oct 11, 2022
c28ed1d
Merge remote-tracking branch 'upstream/master' into pr_build_action
ironictoo Oct 11, 2022
909a932
created .deb file for linux install
ironictoo Sep 5, 2019
7525638
add cuda include dir to c++ compiles
ironictoo Oct 11, 2022
be45592
attempt to fix static linking with msvc
ironictoo Oct 11, 2022
b4c5250
Merge pull request #1 from ironictoo/pr_build_action
jimkring Oct 11, 2022
42adefe
added more version of cuda and ubuntu to test matrix
ironictoo Oct 12, 2022
3636700
remove quotes in matrix
ironictoo Oct 12, 2022
2bc1edd
move cuda matrix
ironictoo Oct 12, 2022
9d0cf73
indentation errors
ironictoo Oct 12, 2022
968e74d
valid cuda-os combinations
ironictoo Oct 12, 2022
46fc229
make pip verbose
ironictoo Oct 12, 2022
7becb29
cmake output python location
ironictoo Oct 12, 2022
22446d8
fix find python in cmake, drop old cuda from ubuntu
ironictoo Oct 12, 2022
540d086
found another old python reference
ironictoo Oct 12, 2022
1832970
delete redundant message
ironictoo Oct 12, 2022
39cb33a
use jimkring/action-install-cuda-toolkit fork
jimkring Oct 15, 2022
a8c80ed
Merge pull request #2 from ironictoo/pr_build_action
jimkring Oct 15, 2022
5ad294a
Added cuda 11.3.0
jimkring Oct 15, 2022
cbd44bb
use jimkring/action-install-cuda-toolkit fork
jimkring Oct 15, 2022
c750151
test latest 11.3.x build
jimkring Oct 15, 2022
a1a9274
try "11.3.1" since "11.3" didn't work
jimkring Oct 15, 2022
5befd0e
added missing Python version
jimkring Oct 15, 2022
286fda0
Set build job name using matrix values
jimkring Oct 15, 2022
fdb0757
tweak build job name
jimkring Oct 15, 2022
a5b687e
ubuntu 11.3.1
jimkring Oct 15, 2022
30da9a0
update cxx version to 20
ironictoo Oct 17, 2022
84d50bb
update cuda c++ standard to 20, cmake to 3.12
ironictoo Oct 17, 2022
a48fd26
Merge branch 'gpufit:master' into cmake_update
ironictoo Oct 17, 2022
e64d155
Merge CMake changes from branch 'pr_build_action' into cmake_update
ironictoo Oct 17, 2022
5d8381d
moved cuda_standard 20 call, remove commented code
ironictoo Oct 17, 2022
0326ea9
removed cuda standard required for 20
ironictoo Oct 17, 2022
a72f4a5
only c++17 is supported by nvcc
ironictoo Oct 18, 2022
628e00d
update required cmake version
ironictoo Dec 21, 2022
3be149b
make c++ standard less restrictive
ironictoo Dec 21, 2022
605780e
Delete CMakeCache.txt during workflow, and fixed bug in ci.yml
ironictoo Dec 28, 2022
ce07db3
ignore error if CMakeCache does not exist
ironictoo Dec 28, 2022
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
3 changes: 2 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ jobs:
id: configure
shell: bash
run: |
if [ "${{ runner.os }}" -eq "Windows" ]
rm -f ${{ env.build_dir }}/CMakeCache.txt
if [ "${{ runner.os }}" = "Windows" ]
then
cmake . -B "${{ env.build_dir }}" -G "${{ matrix.visual_studio }}" -A x64
else
Expand Down
41 changes: 23 additions & 18 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,17 @@

# CMake

cmake_minimum_required( VERSION 3.11 )
cmake_minimum_required( VERSION 3.18 )
set_property( GLOBAL PROPERTY USE_FOLDERS ON )
cmake_policy(SET CMP0091 NEW)

if( NOT PROJECT_NAME )
project( Gpufit VERSION 1.2.0 )
project( Gpufit VERSION 1.2.0 LANGUAGES CUDA CXX)
include( CTest )
endif()

if( NOT CMAKE_CXX_STANDARD )
set( CMAKE_CXX_STANDARD 14 )
endif()

if( MSVC ) # link runtime statically with MSVC
foreach( type ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE} )
string( TOUPPER ${type} TYPE )
foreach( flags CMAKE_C_FLAGS_${TYPE} CMAKE_CXX_FLAGS_${TYPE} )
get_property( help CACHE ${flags} PROPERTY HELPSTRING )
string( REPLACE "/MD" "/MT" ${flags} "${${flags}}" )
set( ${flags} "${${flags}}" CACHE STRING "${help}" FORCE )
endforeach()
endforeach()
set( CMAKE_CXX_STANDARD 11 )
endif()

function( add_launcher target executable arguments working_directory )
Expand Down Expand Up @@ -103,14 +93,14 @@ endif()

# Python

find_package( PythonInterp )
if( PYTHONINTERP_FOUND )
find_package( Python )
if( Python_FOUND )
function( add_python_launcher target )
set( paths "${CMAKE_BINARY_DIR}/$(Configuration)" ${ARGN} )
list( GET paths -1 working_directory )
string( REPLACE ";" "')\nsys.path.append('" paths "${paths}" )
set( arguments "-i -c \"import sys\nsys.path.append('${paths}')\"" )
add_launcher( ${target} "${PYTHON_EXECUTABLE}" "${arguments}" "${working_directory}" )
add_launcher( ${target} "${Python_EXECUTABLE}" "${arguments}" "${working_directory}" )
endfunction()
endif()

Expand Down Expand Up @@ -144,6 +134,14 @@ add_subdirectory( Gpufit )

add_subdirectory( examples/c++/gpu_vs_cpu_profiling )


# link runtime statically with MSVC
set_property(TARGET Gpufit PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET Cpufit PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")


# Launcher
#
# Uses the following variables:
Expand Down Expand Up @@ -173,7 +171,7 @@ if( Matlab_FOUND )
endif()
endif()

if( PYTHONINTERP_FOUND )
if( Python_FOUND )
set( Python_WORKING_DIRECTORY "${home}" CACHE PATH "Python working directory" )
if( Python_WORKING_DIRECTORY )
add_custom_target( RUN_PYTHON )
Expand All @@ -184,6 +182,13 @@ if( PYTHONINTERP_FOUND )
"${Python_WORKING_DIRECTORY}"
)
endif()
if( UNIX )
# Copy over install file for python integration
file(COPY "${CMAKE_SOURCE_DIR}/package/install_gpufit_python.sh"
DESTINATION "${CMAKE_BINARY_DIR}"
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
endif()
endif()

# Tests
Expand Down
189 changes: 49 additions & 140 deletions Gpufit/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,135 +1,61 @@

# CUDA
#
# Uses the following variables:
#
# CUDA_ARCHITECTURES (Default All)
# -- Argument passed to CUDA_SELECT_NVCC_ARCH_FLAGS(...)
# resulting in code_generation_flags
# (see http://cmake.org/cmake/help/v3.7/module/FindCUDA.html).
# CUDA_ARCHITECTURES: Auto | Common | All | ARCH_AND_PTX ...
# Auto: Detects local machine GPU architecture.
# Common: Covers common subset of architectures.
# All: Covers all known architectures.
# ARCH_AND_PTX: NAME | NUM.NUM | NUM.NUM(NUM.NUM) | NUM.NUM+PTX
# NAME: Fermi Kepler Maxwell Kepler+Tegra Kepler+Tesla Maxwell+Tegra Pascal
# NUM: Any number.
# Only those pairs are currently accepted by NVCC though:
# 2.0 2.1 3.0 3.2 3.5 3.7 5.0 5.2 5.3 6.0 6.2
# Examples:
# 2.1(2.0) results in
# -gencode;arch=compute_20,code=sm_21
# Kepler+Tesla results in
# -gencode;arch=compute_37,code=sm_37
# 6.2+PTX results in
# -gencode;arch=compute_62,code=sm_62;-gencode;arch=compute_62,code=compute_62
#
# CUDA_NVCC_FLAGS (Default ${code_generation_flags})
# -- Additional NVCC command line arguments
# (see http://cmake.org/cmake/help/v3.7/module/FindCUDA.html).
# NOTE that multiple arguments must be semi-colon delimited
# (e.g. --compiler-options;-Wall)
#
# Multiple CUDA versions installed, specify which version to use
# Set CUDA_BIN_PATH before running CMake or CUDA_TOOLKIT_ROOT_DIR after first configuration
# to installation folder of desired CUDA version

find_package( CUDA 6.5 REQUIRED )

set( CUDA_ARCHITECTURES ${DEFAULT_CUDA_ARCH} CACHE STRING
"Auto | Common | All | ... see CUDA_SELECT_NVCC_ARCH_FLAGS(...)" )

if( CUDA_ARCHITECTURES STREQUAL Auto )

set( file ${PROJECT_BINARY_DIR}/detect_cuda_architectures.cpp )
file( WRITE ${file} ""
"#include <cuda_runtime.h>\n"
"#include <cstdio>\n"
"int main()\n"
"{\n"
" int count = 0;\n"
" if (cudaSuccess != cudaGetDeviceCount(&count)) return -1;\n"
" if (count == 0) return -1;\n"
" for (int device = 0; device < count; ++device)\n"
" {\n"
" cudaDeviceProp prop;\n"
" if (cudaSuccess == cudaGetDeviceProperties(&prop, device))\n"
" std::printf(\"%d.%d \", prop.major, prop.minor);\n"
" }\n"
" return 0;\n"
"}\n"
)
try_run( run_result compile_result ${PROJECT_BINARY_DIR} ${file}
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${CUDA_INCLUDE_DIRS}"
LINK_LIBRARIES ${CUDA_LIBRARIES}
RUN_OUTPUT_VARIABLE architectures
)
if( run_result EQUAL 0 )
string( REPLACE "2.1" "2.1(2.0)" architectures "${architectures}" )
if( CUDA_VERSION VERSION_LESS "7.0" )
string( REGEX REPLACE "3\\.[27]|5\\.[23]|6\\.[01]" "5.2+PTX" architectures "${architectures}" )
elseif( CUDA_VERSION VERSION_LESS "8.0" )
string( REGEX REPLACE "5\\.3|6\\.[01]" "5.3+PTX" architectures "${architectures}" )
endif()
set( CUDA_ARCHITECTURES "${architectures}" )
endif()

elseif( CUDA_ARCHITECTURES STREQUAL All )
# Uses the CMAKE standard CUDA tools

cmake_minimum_required(VERSION 3.18)

if(NOT DEFINED CMAKE_CUDA_STANDARD)
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
endif()


message( STATUS "CMAKE_CUDA_COMPILER_VERSION=${CMAKE_CUDA_COMPILER_VERSION}")


# All does not include the latest PTX!
set( CUDA_ARCHITECTURES "" )
set( CMAKE_CUDA_ARCHITECTURES_D "" )

if( CUDA_VERSION VERSION_LESS "12.0" )
list( INSERT CUDA_ARCHITECTURES 0 "3.5" "5.0" "5.2" )
if( CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "12.0" )
list( INSERT CMAKE_CUDA_ARCHITECTURES_D 0 35 50 52 )
endif()
if( CUDA_VERSION VERSION_LESS "11.0" )
list( INSERT CUDA_ARCHITECTURES 0 "3.0" "3.2")
if( CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "11.0" )
list( INSERT CMAKE_CUDA_ARCHITECTURES_D 0 30 32)
endif()
if( CUDA_VERSION VERSION_LESS "9.0" )
list( INSERT CUDA_ARCHITECTURES 0 "2.0" "2.1(2.0)" )
if( CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "9.0" )
list( INSERT CMAKE_CUDA_ARCHITECTURES_D 0 20 21 )
endif()

if( CUDA_VERSION VERSION_GREATER "6.5" )
list( APPEND CUDA_ARCHITECTURES "5.3" )


if( CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER "6.5" )
list( APPEND CMAKE_CUDA_ARCHITECTURES_D 53 )
endif()

if( CUDA_VERSION VERSION_GREATER "7.5" )
list( APPEND CUDA_ARCHITECTURES "6.0" "6.1" )
if( CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER "7.5" )
list( APPEND CMAKE_CUDA_ARCHITECTURES_D 60 61 )
endif()

if( CUDA_VERSION VERSION_GREATER "8.0" )
list( APPEND CUDA_ARCHITECTURES "7.0" "7.2")
if( CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER "8.0" )
list( APPEND CMAKE_CUDA_ARCHITECTURES_D 70 72)
endif()

if( CUDA_VERSION VERSION_GREATER "9.2" )
list( APPEND CUDA_ARCHITECTURES "7.5" )
if( CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER "9.2" )
list( APPEND CMAKE_CUDA_ARCHITECTURES_D 75 )
endif()

if( CUDA_VERSION VERSION_GREATER "10.2" )
list( APPEND CUDA_ARCHITECTURES "8.0" )
if( CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER "10.2" )
list( APPEND CMAKE_CUDA_ARCHITECTURES_D 80 )
endif()

if( CUDA_VERSION VERSION_GREATER "11.0" )
list( APPEND CUDA_ARCHITECTURES "8.6" )
if( CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER "11.0" )
list( APPEND CMAKE_CUDA_ARCHITECTURES_D 86 )
endif()

string( APPEND CUDA_ARCHITECTURES "+PTX" )

endif()

message( STATUS "CUDA_ARCHITECTURES=${CUDA_ARCHITECTURES}" )
# string( APPEND CMAKE_CUDA_ARCHITECTURES "+PTX" )
set( CMAKE_CUDA_ARCHITECTURES "${CMAKE_CUDA_ARCHITECTURES_D}" CACHE STRING "List of architectures to compile, default is all")

CUDA_SELECT_NVCC_ARCH_FLAGS( code_generation_flags "${CUDA_ARCHITECTURES}" )
list( APPEND CUDA_NVCC_FLAGS ${code_generation_flags} )

message( STATUS "CUDA_NVCC_FLAGS=${code_generation_flags}" )

if( NOT WIN32 )
list( APPEND CUDA_NVCC_FLAGS --std=c++11)
endif()

# Gpufit

set( GpuHeaders
gpufit.h
constants.h
Expand Down Expand Up @@ -177,7 +103,7 @@ source_group("CUDA Source Files" FILES ${GpuCudaSources})
source_group("CUDA Model Files" FILES ${GpuCudaModels})
source_group("CUDA Estimator Files" FILES ${GpuCudaEstimators})

cuda_add_library( Gpufit SHARED
add_library( Gpufit SHARED
${GpuHeaders}
${GpuSources}
${GpuCudaHeaders}
Expand All @@ -192,38 +118,21 @@ set_target_properties( Gpufit
CXX_VISIBILITY_PRESET hidden
)

# USE_CUBLAS
if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND CUDA_VERSION VERSION_GREATER "6.5")
target_include_directories( Gpufit SYSTEM PUBLIC ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})

# USE_CUBLAS
if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER "6.5")
set( USE_CUBLAS ${DEFAULT_USE_CUBLAS} CACHE BOOL "ON | OFF")
if( USE_CUBLAS )
if ( WIN32 )
if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND CUDA_VERSION VERSION_GREATER_EQUAL "10")
set( CUBLAS_DLL "${CUDA_TOOLKIT_ROOT_DIR}/bin/cublas64_${CUDA_VERSION_MAJOR}.dll" )
else()
set( CUBLAS_DLL "${CUDA_TOOLKIT_ROOT_DIR}/bin/cublas64_${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR}.dll" )
endif()
add_custom_command( TARGET Gpufit POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy_if_different ${CUBLAS_DLL} $<TARGET_FILE_DIR:Gpufit> )
else()
find_cuda_helper_libs(cublas_static)
find_cuda_helper_libs(cublasLt_static)
find_cuda_helper_libs(culibos)

set( CUDA_CUBLAS_LIBRARIES
${CUDA_cublas_static_LIBRARY}
${CUDA_cublasLt_static_LIBRARY}
${CUDA_cudart_static_LIBRARY}
${CUDA_culibos_LIBRARY}
dl
pthread
rt )
endif()

add_definitions( -DUSE_CUBLAS )

target_link_libraries( Gpufit ${CUDA_CUBLAS_LIBRARIES} )
endif()
find_package(CUDAToolkit REQUIRED)
set( STATIC_CUBLAS ON CACHE BOOL "ON | OFF")
if ( STATIC_CUBLAS )
target_link_libraries( Gpufit CUDA::cublas_static CUDA::cublasLt_static)
else ()
target_link_libraries( Gpufit CUDA::cublas CUDA::cublasLt)
endif ()
add_definitions( -DUSE_CUBLAS )
endif()
elseif( CMAKE_SIZEOF_VOID_P EQUAL 4 )
message( STATUS "CUBLAS: 32-bit architecture detected; USE_CUBLAS flag ignored." )
elseif( CUDA_VERSION VERSION_LESS "7.0" )
Expand Down
6 changes: 3 additions & 3 deletions Gpufit/python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ add_custom_target( PYTHON_PACKAGE
set_property( TARGET PYTHON_PACKAGE PROPERTY FOLDER CMakePredefinedTargets )
add_dependencies( PYTHON_PACKAGE Gpufit )

if( NOT PYTHONINTERP_FOUND )
if( NOT Python_FOUND )
message( STATUS "Python NOT found - skipping creation of Python wheel!" )
return()
endif()
Expand All @@ -49,9 +49,9 @@ endif()

add_custom_target( PYTHON_WHEEL ALL
COMMAND ${CMAKE_COMMAND} -E
chdir ${build_directory} "${PYTHON_EXECUTABLE}" setup.py clean --all
chdir ${build_directory} "${Python_EXECUTABLE}" setup.py clean --all
COMMAND ${CMAKE_COMMAND} -E
chdir ${build_directory} "${PYTHON_EXECUTABLE}" setup.py bdist_wheel
chdir ${build_directory} "${Python_EXECUTABLE}" setup.py bdist_wheel
COMMENT "Preparing Python Wheel"
)
set_property( TARGET PYTHON_WHEEL PROPERTY FOLDER CMakePredefinedTargets )
Expand Down
8 changes: 8 additions & 0 deletions Gpufit/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,11 @@ add_boost_test( Gpufit Gauss_Fit_2D_Rotated )
add_boost_test( Gpufit Cauchy_Fit_2D_Elliptic )
add_boost_test( Gpufit Fletcher_Powell_Helix_Fit )
add_boost_test( Gpufit Brown_Dennis_Fit )

if( UNIX )
# Copy over run tests script
file(COPY "${CMAKE_SOURCE_DIR}/Gpufit/tests/test_all.sh"
DESTINATION "${CMAKE_BINARY_DIR}"
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)
endif()
34 changes: 34 additions & 0 deletions Gpufit/tests/test_all.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash

printf "Gauss 2D Rotated\n"
./Gpufit_Test_Gauss_Fit_2D_Rotated

printf "\nGauss 2D Elliptic\n"
./Gpufit_Test_Gauss_Fit_2D_Elliptic

printf "\nGauss 2D\n"
./Gpufit_Test_Gauss_Fit_2D

printf "\nGauss 1D\n"
./Gpufit_Test_Gauss_Fit_1D

printf "\nLinear 1D\n"
./Gpufit_Test_Linear_Fit_1D

printf "\nFletcher Powell Helix\n"
./Gpufit_Test_Fletcher_Powell_Helix_Fit

printf "\nError Handling\n"
./Gpufit_Test_Error_Handling

printf "\nCauchy Fit 2D Elliptic\n"
./Gpufit_Test_Cauchy_Fit_2D_Elliptic

printf "\nBrown Dennis\n"
./Gpufit_Test_Brown_Dennis_Fit

printf "\nTest Consistency\n"
./Cpufit_Gpufit_Test_Consistency



Loading