aboutsummaryrefslogtreecommitdiffstats
path: root/Makefile
blob: 406193a48b3dc7776cac3f36e0076202f4d19471 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# Set this if CUDA is installed in a different location
CUDA ?= /usr/local/cuda
# Note that CXX and CC are predefined as g++ and cc (respectively) by Make
NVCC ?= $(CUDA)/bin/nvcc
# Everything has to have -lcuda, as it's needed for libsmctrl
LDFLAGS := -ldl -lcuda -I$(CUDA)/include -L$(CUDA)/lib64
ARCH = $(shell $(CC) -dumpmachine)
CFLAGS := -Wall -Wno-parentheses

.PHONY: clean tests all install remove run_tests

# ----- Main Library -----
libsmctrl.so: libsmctrl.c libsmctrl.h
	$(CC) $< -shared -o $@ -fPIC $(CFLAGS) $(LDFLAGS)

# -fPIC is needed even if built as a static library, in case we are linked into
# another shared library
libsmctrl.a: libsmctrl.c libsmctrl.h
	$(CC) $< -c -o libsmctrl.o -fPIC -DLIBSMCTRL_STATIC $(CFLAGS) $(LDFLAGS)
	ar rcs $@ libsmctrl.o

# ----- CUDA Wrapper -----
libcuda.so.1: libsmctrl.c libsmctrl.h
	$(CC) $< -shared -o $@ -fPIC -DLIBSMCTRL_WRAPPER $(CFLAGS) $(LDFLAGS)
	@# Replace dynamic symbol dependency on libcuda.so.1 with libcuda.so
	@# Could also be done via patchelf --replace-needed libcuda.so.1 libcuda.so libcuda.so.1
	sed -i "s/libcuda.so.1\x00/libcuda.so\x00\x00\x00/g" libcuda.so.1

# ----- Utilities -----
# Use static linking with tests to avoid LD_LIBRARY_PATH issues
nvtaskset: nvtaskset.c libsmctrl.so libsmctrl.a
	$(CC) $@.c -o $@ -L. -l:libsmctrl.a $(CFLAGS) $(LDFLAGS)

libsmctrl_test_gpc_info: libsmctrl_test_gpc_info.c libsmctrl.a testbench.h
	$(CC) $< -o $@ -g -L. -l:libsmctrl.a $(CFLAGS) $(LDFLAGS)

# ----- Tests -----
libsmctrl_test_mask_shared.o: libsmctrl_test_mask_shared.cu testbench.h
	$(NVCC) -ccbin $(CXX) $< -c -g

libsmctrl_test_supreme_mask: libsmctrl_test_supreme_mask.c libsmctrl.a libsmctrl_test_mask_shared.o libcuda.so.1 nvtaskset
	$(NVCC) -ccbin $(CXX) $@.c -o $@ libsmctrl_test_mask_shared.o -g -L. -l:libsmctrl.a $(LDFLAGS)

libsmctrl_test_global_mask: libsmctrl_test_global_mask.c libsmctrl.a libsmctrl_test_mask_shared.o
	$(NVCC) -ccbin $(CXX) $@.c -o $@ libsmctrl_test_mask_shared.o -g -L. -l:libsmctrl.a $(LDFLAGS)

libsmctrl_test_stream_mask: libsmctrl_test_stream_mask.c libsmctrl.a libsmctrl_test_mask_shared.o
	$(NVCC) -ccbin $(CXX) $@.c -o $@ libsmctrl_test_mask_shared.o -g -L. -l:libsmctrl.a $(LDFLAGS)

libsmctrl_test_stream_mask_override: libsmctrl_test_stream_mask_override.c libsmctrl.a libsmctrl_test_mask_shared.o
	$(NVCC) -ccbin $(CXX) $@.c -o $@ libsmctrl_test_mask_shared.o -g -L. -l:libsmctrl.a $(LDFLAGS)

libsmctrl_test_next_mask: libsmctrl_test_next_mask.c libsmctrl.a libsmctrl_test_mask_shared.o
	$(NVCC) -ccbin $(CXX) $@.c -o $@ libsmctrl_test_mask_shared.o -g -L. -l:libsmctrl.a $(LDFLAGS)

libsmctrl_test_next_mask_override: libsmctrl_test_next_mask_override.c libsmctrl.a libsmctrl_test_mask_shared.o
	$(NVCC) -ccbin $(CXX) $@.c -o $@ libsmctrl_test_mask_shared.o -g -L. -l:libsmctrl.a $(LDFLAGS)

tests: libsmctrl_test_gpc_info libsmctrl_test_supreme_mask \
       libsmctrl_test_global_mask libsmctrl_test_stream_mask \
       libsmctrl_test_stream_mask_override libsmctrl_test_next_mask \
       libsmctrl_test_next_mask_override

all: libsmctrl.so libcuda.so.1 nvtaskset tests

clean:
	rm -f libsmctrl.so libsmctrl.o libsmctrl.a libsmctrl_test_gpc_info \
	      libsmctrl_test_mask_shared.o libsmctrl_test_supreme_mask \
	      libsmctrl_test_global_mask \
	      libsmctrl_test_stream_mask libsmctrl_test_stream_mask_override \
	      libsmctrl_test_next_mask libsmctrl_test_next_mask_override \
	      nvtaskset libcuda.so.1

# On L4T (Linux4Tegra), the paths are different, and there may be multiple copies of libcuda.so.1
install: libcuda.so.1
	@set -e -x; \
	for DIR in /usr/lib/$(ARCH) /usr/local/cuda-*.*/compat /usr/lib/$(ARCH)/nvidia; do \
		if [ ! -d $$DIR ]; then continue; fi; \
		# Check that CUDA is installed in this location \
		if [ ! -f $$DIR/libcuda.so.*.* ]; then continue; fi; \
		# Change libcuda.so link to bypass libcuda.so.1 \
		sudo ln -sf $$DIR/libcuda.so.*.* $$DIR/libcuda.so; \
		# Remove libcuda.so.1 symlink \
		sudo rm $$DIR/libcuda.so.1; \
		# Install wrapper as libcuda.so.1 \
		sudo cp libcuda.so.1 $$DIR/libcuda.so.1; \
	done \
	# Special handling for L4T \
	if [ -d /usr/lib/$(ARCH)/nvidia ]; then sudo ln -sf nvidia/libcuda.so.1 /usr/lib/$(ARCH)/libcuda.so.1; fi

remove:
	@set -e -x; \
	for DIR in /usr/lib/$(ARCH) /usr/local/cuda-*.*/compat /usr/lib/$(ARCH)/nvidia; do \
		if [ ! -d $$DIR ]; then continue; fi; \
		# Check that CUDA is installed in this location \
		if [ ! -f $$DIR/libcuda.so.*.* ]; then continue; fi; \
		# Test that our library in installed here \
		if [ -L $$DIR/libcuda.so.1 ]; then continue; fi; \
		# Overwrite install with original symlinks \
		sudo ln -sf libcuda.so.1 $$DIR/libcuda.so; \
		sudo ln -sf $$DIR/libcuda.so.*.* $$DIR/libcuda.so.1; \
	done

run_tests: tests
	./libsmctrl_test_global_mask
	./libsmctrl_test_next_mask
	./libsmctrl_test_stream_mask
	./libsmctrl_test_next_mask_override
	./libsmctrl_test_stream_mask_override
	@# Must set LD_LIBRARY_PATH in case make install has not been run
	LD_LIBRARY_PATH=. ./libsmctrl_test_supreme_mask
	./libsmctrl_test_gpc_info
	@ echo "All tests passed!"