Skip to content
Snippets Groups Projects
Commit e84cf0a8 authored by Kurt A. O'Hearn's avatar Kurt A. O'Hearn
Browse files

Autotools: refactor build system output. Begin fixing PuReMD-GPU.

parent ca8bbe17
No related branches found
No related tags found
No related merge requests found
Showing
with 1153 additions and 8847 deletions
if USE_CUDA
SUFFIXES = .cu
include cuda.am
include ../cuda.am
endif
AM_CFLAGS = -Wall -O3 -funroll-loops -fstrict-aliasing $(MPI_CFLAGS)
......@@ -15,23 +15,23 @@ if USE_CUDA
# Note: cc 35 for Kepler K20
NVCCFLAGS += -use_fast_math
NVCCFLAGS += -gencode arch=compute_35,code=sm_35
NVCCFLAGS += --compiler-options "$(DEFS) -O3 -funroll-loops -fstrict-aliasing $(MPI_CFLAGS)"
NVCCFLAGS += --compiler-options "$(DEFS) -D__SM_35__ -O3 -funroll-loops -fstrict-aliasing $(MPI_CFLAGS)"
#NVCCFLAGS += --ptxas-options -v
endif
bin_PROGRAMS = src/pg-puremd
src_pg_puremd_SOURCES = src/allocate.c src/basic_comm.c src/ffield.c src/grid.c src/list.c \
bin_PROGRAMS = bin/pg-puremd
bin_pg_puremd_SOURCES = src/allocate.c src/basic_comm.c src/ffield.c src/grid.c src/list.c \
src/lookup.c src/io_tools.c src/reset_tools.c src/restart.c src/random.c \
src/tool_box.c src/traj.c src/analyze.c src/box.c src/system_props.c \
src/control.c src/comm_tools.c src/geo_tools.c src/linear_solvers.c src/neighbors.c \
src/qEq.c src/bond_orders.c src/multi_body.c src/bonds.c src/valence_angles.c \
src/hydrogen_bonds.c src/torsion_angles.c src/nonbonded.c src/forces.c \
src/integrate.c src/init_md.c src/parallelreax.c
src_pg_puremd_LDADD = src/vector.o
bin_pg_puremd_LDADD = src/vector.o
if USE_CUDA
src_pg_puremd_SOURCES += src/cuda_utils.cu src/dev_alloc.cu src/cuda_environment.cu \
bin_pg_puremd_SOURCES += src/cuda_utils.cu src/dev_alloc.cu src/cuda_environment.cu \
src/dev_system_props.cu src/reduction.cu src/center_mass.cu \
src/cuda_copy.cu src/cuda_reset_tools.cu src/dev_list.cu \
src/cuda_neighbors.cu src/cuda_bond_orders.cu src/cuda_bonds.cu \
......@@ -42,7 +42,7 @@ src_pg_puremd_SOURCES += src/cuda_utils.cu src/dev_alloc.cu src/cuda_environment
src/cuda_init_md.cu src/validation.cu src/cuda_lookup.cu
# dummy source to cause C linking
nodist_EXTRA_src_pg_puremd_SOURCES = src/dummy.c
nodist_EXTRA_bin_pg_puremd_SOURCES = src/dummy.c
src_vector.o:
$(AM_V_NVCC)$(NVCC) $(NVCCFLAGS) -maxrregcount=$(MAX_REG_COUNT) -o src/vector.o -c src/vector.c
......@@ -53,11 +53,11 @@ src_vector.o:
endif
src_pg_puremd_CFLAGS = $(AM_CFLAGS) $(CFLAGS)
src_pg_puremd_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS)
src_pg_puremd_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS)
bin_pg_puremd_CFLAGS = $(AM_CFLAGS) $(CFLAGS)
bin_pg_puremd_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS)
bin_pg_puremd_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS)
if USE_CUDA
src_pg_puremd_CFLAGS += $(CUDA_CFLAGS)
src_pg_puremd_LDFLAGS += $(CUDA_LIBS)
bin_pg_puremd_CFLAGS += $(CUDA_CFLAGS)
bin_pg_puremd_LDFLAGS += $(CUDA_LIBS)
endif
SUFFIXES = .cu
include ../cuda.am
AM_CFLAGS = -Wall -O3 -funroll-loops -fstrict-aliasing
AM_CPPFLAGS =
AM_LDFLAGS =
# default CUDA nvcc flags
# Note: cc 13 for Tesla
# Note: cc 20 for Fermi
# Note: cc 30 for Kepler K10
# Note: cc 35 for Kepler K20
NVCCFLAGS += -use_fast_math
NVCCFLAGS += -gencode arch=compute_35,code=sm_35
NVCCFLAGS += --compiler-options "$(DEFS) -D__SM_35__ -O3 -funroll-loops -fstrict-aliasing"
#NVCCFLAGS += --ptxas-options -v
bin_PROGRAMS = bin/puremd-gpu
bin_puremd_gpu_SOURCES = src/analyze.c src/print_utils.c src/reset_utils.c src/param.c src/pdb_tools.c \
src/GMRES.cu src/QEq.cu src/allocate.cu src/bond_orders.cu \
src/box.cu src/forces.cu src/four_body_interactions.cu \
src/grid.cu src/init_md.cu src/integrate.cu src/list.cu \
src/lookup.cu src/neighbors.cu \
src/restart.cu src/single_body_interactions.cu \
src/system_props.cu src/three_body_interactions.cu \
src/traj.cu src/two_body_interactions.cu src/vector.cu \
src/testmd.cu \
src/cuda_utils.cu src/cuda_copy.cu src/cuda_init.cu src/reduction.cu \
src/center_mass.cu src/helpers.cu src/validation.cu src/matvec.cu
# dummy source to cause C linking
nodist_EXTRA_bin_puremd_gpu_SOURCES = src/dummy.c
bin_puremd_gpu_CFLAGS = $(AM_CFLAGS) $(CFLAGS) $(CUDA_CFLAGS)
bin_puremd_gpu_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS)
bin_puremd_gpu_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS) $(CUDA_LIBS)
This diff is collapsed.
......@@ -4,15 +4,24 @@
AC_PREREQ([2.69])
AC_INIT([PuReMD-GPU], [1.0], [ohearnku@msu.edu hma@msu.edu])
#AM_INIT_AUTOMAKE([1.15])
LT_PREREQ([2.2])
LT_INIT([dlopen])
AM_INIT_AUTOMAKE([1.15 subdir-objects -Wall -Werror foreign])
AM_SILENT_RULES([yes])
#LT_PREREQ([2.2])
#LT_INIT([dlopen])
AC_CONFIG_MACRO_DIR([../m4])
AC_LANG([C])
AC_CONFIG_SRCDIR([src/analyze.c])
AC_CONFIG_HEADERS([src/config.h])
# Headline formatter
AC_DEFUN([CONFIGURE_HEADLINE],
[
echo; echo "+++ $1 +++"
])
# Checks for programs.
AC_PROG_CC
AC_PROG_CPP
......@@ -51,22 +60,38 @@ AC_C_INLINE
AC_TYPE_SIZE_T
AC_CHECK_TYPES([gzFile], [],
[AC_MSG_FAILURE([gzFile type not found in zlib.h], [1])], [#include<zlib.h>])
# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_STRTOD
AC_CHECK_FUNCS([memset pow sqrt])
# Check for CUDA support.
CONFIGURE_HEADLINE([ CUDA support ])
AX_CUDA
NVCCFLAGS=
if test "BUILD_DEBUG" = "true"
then
NVCCFLAGS+=" -g -G"
fi
AC_DEFINE([HAVE_CUDA], [1], [Define to 1 if you have CUDA support enabled.])
if test "BUILD_PROF" = "true"
then
NVCCFLAGS+=" --compiler-options ${gprof_flags}"
fi
AC_CHECK_TYPES([cublasHandle_t], [],
[AC_MSG_FAILURE([cublasHandle_t type not found in cublas.h], [1])], [#include<cublas_v2.h>])
AC_CHECK_TYPES([cusparseHandle_t], [],
[AC_MSG_FAILURE([cusparseHandle_t type not found in cusparse.h], [1])], [#include<cusparse_v2.h>])
AC_CHECK_TYPES([cusparseMatDescr_t], [],
[AC_MSG_FAILURE([cusparseMatDescr_t type not found in cusparse.h], [1])], [#include<cusparse_v2.h>])
AC_CHECK_TYPES([CUSPARSE_MATRIX_TYPE_GENERAL], [],
[AC_MSG_FAILURE([CUSPARSE_MATRIX_TYPE_GENERAL type not found in cusparse.h], [1])], [#include<cusparse_v2.h>])
AC_CHECK_TYPES([CUSPARSE_INDEX_BASE_ZERO], [],
[AC_MSG_FAILURE([CUSPARSE_INDEX_BASE_ZERO type not found in cusparse.h], [1])], [#include<cusparse_v2.h>])
# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_STRTOD
AC_CHECK_FUNCS([memset pow sqrt])
#AC_CHECK_TYPES([CUSPARSE_MATRIX_TYPE_GENERAL], [],
# [AC_MSG_FAILURE([CUSPARSE_MATRIX_TYPE_GENERAL type not found in cusparse.h], [1])], [#include<cusparse_v2.h>])
#AC_CHECK_TYPES([CUSPARSE_INDEX_BASE_ZERO], [],
# [AC_MSG_FAILURE([CUSPARSE_INDEX_BASE_ZERO type not found in cusparse.h], [1])], [#include<cusparse_v2.h>])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
BINDIR = ./bin
CC = gcc
NVCC = nvcc
LIBS = -L/opt/cuda/lib64 -lm -lz -lcuda -lcudart -lcublas -lcusparse -m64
#LIBS=-L/opt/cuda/lib64 -lm -lz -lcuda -lcudart
#Debug Options
#__CUDA_MEM__ Prints the memory allocated to the executable
#__DEBUG_CUDA__ Prints debug information in CUDA
#__BUILD_DEBUG__ builds a debug version, which runs serial and gpu code at the same time for
# every time step and validates the results
NVCCFLAGS = -I. -I/opt/cuda/include -D__USE_GPU__ -arch=sm_20 -O3 -Xptxas="-O3"
CFLAGS = -I. -Wall -funroll-loops -fstrict-aliasing -O3
DEFS = $(CFLAGS)
NVCCDEFS = $(NVCCFLAGS)
FLAG = $(DEFS) $(INCS) $(LIBS)
NVCCFLAG = $(NVCCDEFS) $(LIBS)
OBJ = GMRES.o QEq.o allocate.o analyze.o bond_orders.o \
box.o forces.o four_body_interactions.o \
grid.o init_md.o integrate.o list.o \
lookup.o neighbors.o param.o pdb_tools.o \
print_utils.o reset_utils.o \
restart.o single_body_interactions.o \
system_props.o three_body_interactions.o \
traj.o two_body_interactions.o vector.o \
testmd.o \
cuda_utils.o cuda_copy.o cuda_init.o reduction.o \
center_mass.o helpers.o validation.o matvec.o
all: gpu
#
#build the executable here
#
gpu: $(OBJ) Makefile
$(NVCC) $(NVCCFLAG) $(OBJ) -o puremd-gpu
#
#Existing C code
#
#
param.o: param.c param.h mytypes.h traj.o
$(CC) $(DEFS) -c param.c
restart.o: restart.c restart.h mytypes.h box.h
$(CC) $(DEFS) -c restart.c
pdb_tools.o: pdb_tools.c pdb_tools.h mytypes.h box.h list.h restart.h param.h
$(CC) $(DEFS) -c pdb_tools.c
analyze.o: analyze.h analyze.c
$(CC) $(DEFS) -c analyze.c
print_utils.o: print_utils.h print_utils.c
$(CC) $(DEFS) -c print_utils.c
#
# Code converted to cuda
#
traj.o: traj.cu traj.h mytypes.h
$(NVCC) $(NVCCDEFS) -c traj.cu
grid.o: grid.h grid.cu
$(NVCC) $(NVCCDEFS) -c grid.cu
integrate.o: integrate.h integrate.cu
$(NVCC) $(NVCCDEFS) -c integrate.cu
vector.o: vector.h vector.cu
$(NVCC) $(NVCCDEFS) -c vector.cu
system_props.o: system_props.h system_props.cu
$(NVCC) $(NVCCDEFS) -c system_props.cu
cuda_copy.o: cuda_copy.h cuda_copy.cu
$(NVCC) $(NVCCDEFS) -c cuda_copy.cu
cuda_utils.o: cuda_utils.h cuda_utils.cu
$(NVCC) $(NVCCDEFS) -c cuda_utils.cu
cuda_init.o: cuda_init.h cuda_init.cu
$(NVCC) $(NVCCDEFS) -c cuda_init.cu
reduction.o: reduction.h reduction.cu
$(NVCC) $(NVCCDEFS) -c reduction.cu
center_mass.o: center_mass.h center_mass.cu
$(NVCC) $(NVCCDEFS) -c center_mass.cu
box.o: box.h
$(NVCC) $(NVCCDEFS) -c box.cu
init_md.o: init_md.h init_md.cu
$(NVCC) $(NVCCDEFS) -c init_md.cu
helpers.o: helpers.h helpers.cu
$(NVCC) $(NVCCDEFS) -c helpers.cu
GMRES.o: GMRES.h GMRES.cu
$(NVCC) $(NVCCDEFS) -c GMRES.cu
neighbors.o: neighbors.cu neighbors.h
$(NVCC) $(NVCCDEFS) -c neighbors.cu
reset_utils.o: reset_utils.h reset_utils.cu mytypes.h list.h vector.h
$(NVCC) $(NVCCDEFS) -c reset_utils.cu
list.o: list.h
$(NVCC) $(NVCCDEFS) -c list.cu
forces.o: forces.h forces.cu
$(NVCC) $(NVCCDEFS) -c forces.cu
allocate.o: allocate.h allocate.cu
$(NVCC) $(NVCCDEFS) -c allocate.cu
lookup.o: lookup.h lookup.cu
$(NVCC) $(NVCCDEFS) -c lookup.cu
two_body_interactions.o: two_body_interactions.h two_body_interactions.cu
$(NVCC) $(NVCCDEFS) -c two_body_interactions.cu
bond_orders.o: bond_orders.h bond_orders.cu
$(NVCC) $(NVCCDEFS) -c bond_orders.cu
single_body_interactions.o: single_body_interactions.h single_body_interactions.cu
$(NVCC) $(NVCCDEFS) -c single_body_interactions.cu
three_body_interactions.o: three_body_interactions.h three_body_interactions.cu
$(NVCC) $(NVCCDEFS) -c three_body_interactions.cu
four_body_interactions.o: four_body_interactions.h four_body_interactions.cu
$(NVCC) $(NVCCDEFS) -c four_body_interactions.cu
validation.o: validation.h validation.cu
$(NVCC) $(NVCCDEFS) -c validation.cu
QEq.o: QEq.h QEq.cu
$(NVCC) $(NVCCDEFS) -c QEq.cu
matvec.o: matvec.h matvec.cu
$(NVCC) $(NVCCDEFS) -c matvec.cu
testmd.o: testmd.cu mytypes.h param.o traj.o restart.o pdb_tools.o list.o vector.o
$(NVCC) $(NVCCDEFS) -c testmd.cu
#
# Clean up here
#
clean:
rm -f *.o *~ core
/* src/config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if the system has the type `cublasHandle_t'. */
#undef HAVE_CUBLASHANDLE_T
/* Define to 1 if the system has the type `cusparseHandle_t'. */
#undef HAVE_CUSPARSEHANDLE_T
/* Define to 1 if the system has the type `cusparseMatDescr_t'. */
#undef HAVE_CUSPARSEMATDESCR_T
/* Define to 1 if the system has the type `CUSPARSE_INDEX_BASE_ZERO'. */
#undef HAVE_CUSPARSE_INDEX_BASE_ZERO
/* Define to 1 if the system has the type `CUSPARSE_MATRIX_TYPE_GENERAL'. */
#undef HAVE_CUSPARSE_MATRIX_TYPE_GENERAL
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if the system has the type `gzFile'. */
#undef HAVE_GZFILE
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
to 0 otherwise. */
#undef HAVE_MALLOC
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `memset' function. */
#undef HAVE_MEMSET
/* Define to 1 if you have the `pow' function. */
#undef HAVE_POW
/* Define to 1 if you have the `sqrt' function. */
#undef HAVE_SQRT
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if the system has the type `_Bool'. */
#undef HAVE__BOOL
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#undef LT_OBJDIR
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
/* Define to rpl_malloc if the replacement function should be used. */
#undef malloc
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t
SUBDIRS = src
AM_CFLAGS = -Wall -O3 -funroll-loops -fstrict-aliasing #-finline-functions -finline-limit=15 -qhot
bin_PROGRAMS = bin/puremd
bin_puremd_SOURCES = src/allocate.c src/basic_comm.c src/ffield.c src/grid.c src/list.c src/lookup.c \
src/io_tools.c src/reset_tools.c src/restart.c src/random.c src/tool_box.c src/traj.c \
src/vector.c src/analyze.c src/box.c src/system_props.c src/control.c src/comm_tools.c \
src/geo_tools.c src/linear_solvers.c src/neighbors.c src/qEq.c src/bond_orders.c src/multi_body.c \
src/bonds.c src/valence_angles.c src/hydrogen_bonds.c src/torsion_angles.c src/nonbonded.c src/forces.c \
src/integrate.c src/init_md.c src/parallelreax.c
bin_puremd_CFLAGS = $(AM_CFLAGS) $(MPI_CFLAGS)
bin_puremd_LDFLAGS = $(AM_LDFLAGS) $(MPI_LDFLAGS)
......@@ -4,7 +4,7 @@
AC_PREREQ([2.69])
AC_INIT([PuReMD], [1.0], [ohearnku@msu.edu hma@msu.edu])
AM_INIT_AUTOMAKE([1.15 -Wall -Werror foreign])
AM_INIT_AUTOMAKE([1.15 subdir-objects -Wall -Werror foreign])
AM_SILENT_RULES([yes])
#LT_PREREQ([2.2])
#LT_INIT([dlopen])
......@@ -107,6 +107,6 @@ fi
AC_SUBST(MPI_CFLAGS)
AC_SUBST(MPI_LDFLAGS)
AC_CONFIG_FILES([Makefile src/Makefile])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
AM_CFLAGS = -Wall -O3 -funroll-loops -fstrict-aliasing #-finline-functions -finline-limit=15 -qhot
bin_PROGRAMS = puremd
puremd_SOURCES = allocate.c basic_comm.c ffield.c grid.c list.c lookup.c \
io_tools.c reset_tools.c restart.c random.c tool_box.c traj.c \
vector.c analyze.c box.c system_props.c control.c comm_tools.c \
geo_tools.c linear_solvers.c neighbors.c qEq.c bond_orders.c multi_body.c \
bonds.c valence_angles.c hydrogen_bonds.c torsion_angles.c nonbonded.c forces.c \
integrate.c init_md.c parallelreax.c
puremd_CFLAGS = $(AM_CFLAGS) $(MPI_CFLAGS)
puremd_LDFLAGS = $(AM_LDFLAGS) $(MPI_LDFLAGS)
File moved
###
# 1. Convert the pdb file to custom format which is an intermediate format
# below is the awk command. Paste this command on the command line and
# change the file names appropriately.
###
awk '{if($1=="CRYST1") print "BOXGEO", $2, $3, $4, $5, $6, $7; if($1=="ATOM")
print $2, $3, $12, $6, $7, $8;}' <input-file>.pdb >& <output-file>.cus
###
#
# 2. Convert the custom format to geo format with the following command
# replicate_geo.awk script can also be used to replicate the box in
# any of the x, y, z directions. They are set as 1, 1, 1 for now.
# If you want to replicate it, just change these numbers at the beginning
# of the replicate_geo.awk file.
###
awk -f replicate_geo.awk <output-file>.cus > <output-flie>.water.geo
###
#
# 3. Open the geo file and insert a line below the BOXGEO line
# BOXGEO is the very first line which contains the BOX geometry
# The new line to be inserted contains the number of atoms in the
# newly created geo file. This number should be equal to the
# total number of lines in the geo file - (2). one is the first line
# which is the BOXGEO line and second one is for the newly inserted line.
###
SUBDIRS = src
AM_CFLAGS += -Wall -O3 -funroll-loops -fstrict-aliasing
bin_PROGRAMS = bin/spuremd
bin_spuremd_SOURCES = src/grid.c src/list.c src/lookup.c src/print_utils.c \
src/reset_utils.c src/restart.c src/random.c src/traj.c \
src/vector.c src/allocate.c src/analyze.c src/box.c src/system_props.c \
src/param.c src/pdb_tools.c src/neighbors.c src/GMRES.c src/QEq.c src/bond_orders.c \
src/single_body_interactions.c src/two_body_interactions.c \
src/three_body_interactions.c src/four_body_interactions.c src/forces.c \
src/integrate.c src/init_md.c src/testmd.c
......@@ -4,7 +4,7 @@
AC_PREREQ([2.69])
AC_INIT([sPuReMD], [1.0], [ohearnku@msu.edu hma@msu.edu])
AM_INIT_AUTOMAKE([1.15 -Wall -Werror foreign])
AM_INIT_AUTOMAKE([1.15 subdir-objects -Wall -Werror foreign])
AM_SILENT_RULES([yes])
#LT_PREREQ([2.2])
#LT_INIT([dlopen])
......@@ -57,7 +57,6 @@ if test "x$BUILD_OPENMP" = "xyes"; then
fi
fi
AC_CONFIG_FILES([Makefile
src/Makefile])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
AM_CFLAGS += -Wall -O3 -funroll-loops -fstrict-aliasing
bin_PROGRAMS = spuremd
spuremd_SOURCES = grid.c list.c lookup.c print_utils.c \
reset_utils.c restart.c random.c traj.c \
vector.c allocate.c analyze.c box.c system_props.c \
param.c pdb_tools.c neighbors.c GMRES.c QEq.c bond_orders.c \
single_body_interactions.c two_body_interactions.c \
three_body_interactions.c four_body_interactions.c forces.c \
integrate.c init_md.c testmd.c
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment