4
1
mirror of https://github.com/pfloos/quack synced 2025-01-03 01:56:09 +01:00

linked CUDA module with QuAcK properley

This commit is contained in:
Abdallah Ammar 2024-11-26 16:33:06 +01:00
parent a10e4c8c23
commit 41dd532d0e
4 changed files with 22 additions and 45 deletions

View File

@ -1,11 +1,11 @@
NVCC = nvcc
NVFLAGS = -O2 --compiler-options '-O2 -Wall'
NVFLAGS = -O2 --compiler-options '-O2 -Wall -fPIC'
CC = gcc
CFLAGS = -O2 -Wall -g
CFLAGS = -O2 -Wall -g -fPIC
FC = gfortran
FFLAGS = -O2 -Wall -g
FFLAGS = -O2 -Wall -g -fPIC
SRC_DIR = src
INC_DIR = include
@ -16,28 +16,27 @@ CU_SRC = $(wildcard $(SRC_DIR)/*.cu)
CU_OBJ = $(CU_SRC:$(SRC_DIR)/%.cu=$(BLD_DIR)/%.o)
C_SRC = $(wildcard $(SRC_DIR)/*.c)
C_OBJ = $(CU_SRC:$(SRC_DIR)/%.c=$(BLD_DIR)/%.o)
C_OBJ = $(C_SRC:$(SRC_DIR)/%.c=$(BLD_DIR)/%.o)
F_SRC = $(SRC_DIR)/cu_quack_module.f90
F_OBJ = $(BLD_DIR)/cu_quack_module.o
F_SRC = #$(SRC_DIR)/cu_quack_module.f90
F_OBJ = #$(BLD_DIR)/cu_quack_module.o
OUTPUT_LIB = $(BLD_DIR)/cuda.a
OUTPUT_LIB = $(BLD_DIR)/libcuquack.so
all: $(OUTPUT_LIB)
$(OUTPUT_LIB): $(CU_OBJ) $(C_OBJ) $(F_OBJ)
ar rcs $(OUTPUT_LIB) $(CU_OBJ) $(C_OBJ) $(F_OBJ)
$(CC) -shared -o $(OUTPUT_LIB) $(CU_OBJ) $(C_OBJ) $(F_OBJ)
$(CU_OBJ): $(CU_SRC)
$(BLD_DIR)/%.o: $(SRC_DIR)/%.cu
$(NVCC) $(NVFLAGS) -c -o $@ $< -I$(INC_DIR)
$(C_OBJ): $(C_SRC)
$(BLD_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c -o $@ $< -I$(INC_DIR)
$(F_OBJ): $(F_SRC)
$(FC) $(FFLAGS) -c -o $@ $< -J$(BLD_DIR)
.PHONY: clean
clean:
rm -f $(BLD_DIR)/*

View File

@ -1,26 +0,0 @@
module cu_quack_module
use, intrinsic :: iso_c_binding
implicit none
interface
! ---
subroutine ph_drpa(nO, nBas, eps, ERI) bind(C, name = "cutc_int")
import c_int, c_double
integer(c_int), intent(in), value :: nO, nBas
real(c_double), intent(in) :: eps(nBas)
real(c_double), intent(in) :: ERI(nBas,nBas,nBas,nBas)
end subroutine ph_drpa
! ---
end interface
end module cu_quack_module

View File

@ -2,6 +2,8 @@
#include <cuda.h>
#include <stdio.h>
#include <cublas_v2.h>
#include <cstring>
extern "C" void check_Cuda_Errors(cudaError_t err, const char* msg, const char* file, int line) {
@ -13,7 +15,7 @@ extern "C" void check_Cuda_Errors(cudaError_t err, const char* msg, const char*
}
const char* cublasGetErrorString(cublasStatus_t status) {
const char* cublas_Get_Error_String(cublasStatus_t status) {
switch (status) {
case CUBLAS_STATUS_SUCCESS:
return "CUBLAS_STATUS_SUCCESS";
@ -41,9 +43,9 @@ const char* cublasGetErrorString(cublasStatus_t status) {
extern "C" void check_Cublas_Errors(cublasStatus_t status, const char* msg, const char* file, int line) {
const char* err = cublasGetErrorString(status);
const char* err = cublas_Get_Error_String(status);
if (err != "CUBLAS_STATUS_SUCCESS") {
if (strcmp(err, "CUBLAS_STATUS_SUCCESS") != 0) {
printf("CUBLAS Error in %s at line %d\n", file, line);
printf("%s - %s\n", msg, err);
exit(0);

View File

@ -120,7 +120,6 @@ IDIR=$QUACK_ROOT/include
LDIR=$QUACK_ROOT/lib
BDIR=$QUACK_ROOT/bin
SDIR=$QUACK_ROOT/src
CUDA_DIR=$QUACK_ROOT/src/cuda/build
LIBXC_VERSION=5.0.0
@ -187,6 +186,12 @@ exe_dirs = ["QuAcK"]
lib_dirs = list(filter(lambda x: os.path.isdir(x) and \
x not in ["cuda"] and \
x not in exe_dirs, os.listdir(".")))
if USE_GPU:
i = lib_dirs.index("mod")
lib_dirs[0], lib_dirs[i] = lib_dirs[i], lib_dirs[0]
else:
lib_dirs.remove("mod")
print(lib_dirs)
def create_ninja_in_libdir(directory):
def write_rule(f, source_file, replace):
@ -249,9 +254,6 @@ rule build_lib
sources = [ "$SDIR/{0}/{1}".format(exe_dir,x) for x in os.listdir(exe_dir) ]
sources = filter(lambda x: x.endswith(".f") or x.endswith(".f90"), sources)
sources = " ".join(sources)
if USE_GPU:
f.write("build $BDIR/{0}: build_exe $CUDA_DIR/cuda.a {1} {2}\n".format(exe_dir,libs,sources))
else:
f.write("build $BDIR/{0}: build_exe {1} {2}\n".format(exe_dir,libs,sources))
f.write(" dir = {0} \n".format(exe_dir) )