CC=g++ -m64
LD=g++ -m64
CFLAGS= -c -O3 -g
LDFLAGS= -lm -lrt
CUDACC=nvcc
CUDACFLAGS= -lineinfo -c -O3 -g --ptxas-options=-v -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
CUDADIR= /usr/local/cuda
CUDAINCLUDEDIR= $(CUDADIR)/include
CUDASDKIN=/usr/local/cuda/C/common/inc
#CUDASDKLIB=/usr/local/cuda/C/lib
CUDALDFLAGS=-L$(CUDADIR)/lib64 -lcudart #-lcutil_x86_64 
MPILIBS= -L/usr/lib64/openmpi/lib -lmpi_cxx -lmpi

all: isingModelsMGPU

isingModelsMGPU: isingModelsMGPU.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o
	${LD} -o isingModelsMGPU isingModelsMGPU.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o  ${LDFLAGS} ${CUDALDFLAGS} ${MPILIBS}

benchmarkSliced: benchmarkSliced.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o
	${LD} -o benchmarkSliced benchmarkSliced.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o  ${LDFLAGS} ${CUDALDFLAGS} ${MPILIBS}

benchmarkMGPU: benchmarkMGPU.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o
	${LD} -o benchmarkMGPU benchmarkMGPU.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o  ${LDFLAGS} ${CUDALDFLAGS} ${MPILIBS}

benchmarkSmooth: benchmarkSmooth.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o
	${LD} -o benchmarkSmooth benchmarkSmooth.o cudaEA3DMGPU.o myRNG.o MSC.o mscmpi.o assign_process_gpu.o globalMPI.o  ${LDFLAGS} ${CUDALDFLAGS} ${MPILIBS}


.c.o:; $(CC) $(CFLAGS) $< -o $@

isingModelsMGPU.o: isingModelsMGPU.cu
	$(CUDACC) $(CUDACFLAGS) -I$(CUDAINCLUDEDIR) -I$(CUDASDKIN) isingModelsMGPU.cu

benchmarkSliced.o: benchmarkSliced.cu
	$(CUDACC) $(CUDACFLAGS) -I$(CUDAINCLUDEDIR) -I$(CUDASDKIN) benchmarkSliced.cu

benchmarkMGPU.o: benchmarkMGPU.cu
	$(CUDACC) $(CUDACFLAGS) -I$(CUDAINCLUDEDIR) -I$(CUDASDKIN) benchmarkMGPU.cu

benchmarkSmooth.o: benchmarkSmooth.cu
	$(CUDACC) $(CUDACFLAGS) -I$(CUDAINCLUDEDIR) -I$(CUDASDKIN) benchmarkSmooth.cu

cudaEA3DMGPU.o: cudaEA3DMGPU.cu
	$(CUDACC) $(CUDACFLAGS) -I$(CUDAINCLUDEDIR) -I$(CUDASDKIN) cudaEA3DMGPU.cu

myRNG.o: myRNG.cu
	$(CUDACC) $(CUDACFLAGS) -I$(CUDAINCLUDEDIR) -I$(CUDASDKIN) myRNG.cu

mscmpi.o: mscmpi.c
	mpicc -m64 -c mscmpi.c -I.

assign_process_gpu.o: assign_process_gpu.c
	mpicc -m64 -c assign_process_gpu.c -I. -I/usr/local/cuda/include

clean:
	rm -rf *.o isingModelsMGPU benchmarkSliced benchmarkMGPU benchmarkSmooth
