Imported Upstream version 3.4
[platform/upstream/ccache.git] / test / suites / nvcc.bash
1 nvcc_PROBE() {
2     if [ -z "$REAL_NVCC" ]; then
3         echo "nvcc is not available"
4     elif [ -z "$REAL_CUOBJDUMP" ]; then
5         echo "cuobjdump is not available"
6     fi
7 }
8
9 nvcc_SETUP() {
10     # Test code using only c++ (option --x c++). Faster than compiling cuda.
11     cat <<EOF > test_cpp.cu
12 #ifndef NUM
13 #define NUM 10000
14 #endif
15
16 void caller() {
17   for (int i = 0; i < NUM; ++i);
18 }
19 EOF
20
21     # Option files to modify the define.
22     cat <<EOF >test1.optf
23 -DNUM=1
24 EOF
25     cat <<EOF >test2.optf
26 -DNUM=2
27 EOF
28
29     # Test code using cuda.
30     cat <<EOF >test_cuda.cu
31 #ifndef NUM
32 #define NUM 10000
33 #endif
34
35 __global__
36 void add(int *a, int *b) {
37   int i = blockIdx.x;
38   if (i < NUM) {
39     b[i] = 2 * a[i];
40   }
41 }
42
43 void caller() {
44   add<<<NUM, 1>>>(NULL,NULL);
45 }
46 EOF
47 }
48
49 nvcc_tests() {
50     # Reference file testing was not successful due to different "fatbin" data.
51     # Another source of differences are the temporary files created by nvcc;
52     # that can be avoided by using the options "--keep --keep-dir ./keep". So
53     # instead of comparing the binary object files, we compare the dumps of
54     # "cuobjdump -all -elf -symbols -ptx -sass test1.o".
55     nvcc_opts_cpp="-Wno-deprecated-gpu-targets -c --x c++"
56     nvcc_opts_cuda="-Wno-deprecated-gpu-targets -c"
57     nvcc_opts_gpu1="--generate-code arch=compute_50,code=compute_50"
58     nvcc_opts_gpu2="--generate-code arch=compute_52,code=sm_52"
59     ccache_nvcc_cpp="$CCACHE $REAL_NVCC $nvcc_opts_cpp"
60     ccache_nvcc_cuda="$CCACHE $REAL_NVCC $nvcc_opts_cuda"
61     cuobjdump="$REAL_CUOBJDUMP -all -elf -symbols -ptx -sass"
62
63     # -------------------------------------------------------------------------
64     TEST "Simple mode"
65
66     $REAL_NVCC $nvcc_opts_cpp -o reference_test1.o test_cpp.cu
67
68     # First compile.
69     $ccache_nvcc_cpp test_cpp.cu
70     expect_stat 'cache hit (preprocessed)' 0
71     expect_stat 'cache miss' 1
72     expect_stat 'files in cache' 1
73     expect_equal_files reference_test1.o test_cpp.o
74
75     $ccache_nvcc_cpp test_cpp.cu
76     expect_stat 'cache hit (preprocessed)' 1
77     expect_stat 'cache miss' 1
78     expect_stat 'files in cache' 1
79     expect_equal_files reference_test1.o test_cpp.o
80
81     # -------------------------------------------------------------------------
82     TEST "Different GPU architectures"
83
84     $REAL_NVCC $nvcc_opts_cuda                 -o reference_test1.o test_cuda.cu
85     $REAL_NVCC $nvcc_opts_cuda $nvcc_opts_gpu1 -o reference_test2.o test_cuda.cu
86     $REAL_NVCC $nvcc_opts_cuda $nvcc_opts_gpu2 -o reference_test3.o test_cuda.cu
87     $cuobjdump reference_test1.o > reference_test1.dump
88     $cuobjdump reference_test2.o > reference_test2.dump
89     $cuobjdump reference_test3.o > reference_test3.dump
90     expect_different_files reference_test1.dump reference_test2.dump
91     expect_different_files reference_test1.dump reference_test3.dump
92     expect_different_files reference_test2.dump reference_test3.dump
93
94     $ccache_nvcc_cuda test_cuda.cu
95     expect_stat 'cache hit (preprocessed)' 0
96     expect_stat 'cache miss' 1
97     expect_stat 'files in cache' 1
98     $cuobjdump test_cuda.o > test1.dump
99     expect_equal_files reference_test1.dump test1.dump
100
101     # Other GPU.
102     $ccache_nvcc_cuda $nvcc_opts_gpu1 test_cuda.cu
103     expect_stat 'cache hit (preprocessed)' 0
104     expect_stat 'cache miss' 2
105     expect_stat 'files in cache' 2
106     $cuobjdump test_cuda.o > test1.dump
107     expect_equal_files reference_test2.dump test1.dump
108
109     $ccache_nvcc_cuda $nvcc_opts_gpu1 test_cuda.cu
110     expect_stat 'cache hit (preprocessed)' 1
111     expect_stat 'cache miss' 2
112     expect_stat 'files in cache' 2
113     $cuobjdump test_cuda.o > test1.dump
114     expect_equal_files reference_test2.dump test1.dump
115
116     # Another GPU.
117     $ccache_nvcc_cuda $nvcc_opts_gpu2 test_cuda.cu
118     expect_stat 'cache hit (preprocessed)' 1
119     expect_stat 'cache miss' 3
120     expect_stat 'files in cache' 3
121     $cuobjdump test_cuda.o > test1.dump
122     expect_equal_files reference_test3.dump test1.dump
123
124     $ccache_nvcc_cuda $nvcc_opts_gpu2 test_cuda.cu
125     expect_stat 'cache hit (preprocessed)' 2
126     expect_stat 'cache miss' 3
127     expect_stat 'files in cache' 3
128     $cuobjdump test_cuda.o > test1.dump
129     expect_equal_files reference_test3.dump test1.dump
130
131     # -------------------------------------------------------------------------
132     TEST "Different defines"
133
134     $REAL_NVCC $nvcc_opts_cpp            -o reference_test1.o test_cpp.cu
135     $REAL_NVCC $nvcc_opts_cpp -DNUM=10   -o reference_test2.o test_cpp.cu
136     expect_different_files reference_test1.o reference_test2.o
137
138     $ccache_nvcc_cpp test_cpp.cu
139     expect_stat 'cache hit (preprocessed)' 0
140     expect_stat 'cache miss' 1
141     expect_stat 'files in cache' 1
142     expect_equal_files reference_test1.o test_cpp.o
143
144     # Specified define, but unused. Can only be found by preprocessed mode.
145     $ccache_nvcc_cpp -DDUMMYENV=1 test_cpp.cu
146     expect_stat "cache hit (preprocessed)" 1
147     expect_stat 'cache miss' 1
148     expect_stat 'files in cache' 1
149     expect_equal_files reference_test1.o test_cpp.o
150
151     # Specified used define.
152     $ccache_nvcc_cpp -DNUM=10 test_cpp.cu
153     expect_stat "cache hit (preprocessed)" 1
154     expect_stat 'cache miss' 2
155     expect_stat 'files in cache' 2
156     expect_equal_files reference_test2.o test_cpp.o
157
158     $ccache_nvcc_cpp -DNUM=10 test_cpp.cu
159     expect_stat 'cache hit (preprocessed)' 2
160     expect_stat 'cache miss' 2
161     expect_stat 'files in cache' 2
162     expect_equal_files reference_test2.o test_cpp.o
163
164     # -------------------------------------------------------------------------
165     TEST "Option file"
166
167     $REAL_NVCC $nvcc_opts_cpp -optf test1.optf -o reference_test1.o test_cpp.cu
168     $REAL_NVCC $nvcc_opts_cpp -optf test2.optf -o reference_test2.o test_cpp.cu
169     expect_different_files reference_test1.o reference_test2.o
170
171     $ccache_nvcc_cpp -optf test1.optf test_cpp.cu
172     expect_stat 'cache hit (preprocessed)' 0
173     expect_stat 'cache miss' 1
174     expect_stat 'files in cache' 1
175     expect_equal_files reference_test1.o test_cpp.o
176
177     $ccache_nvcc_cpp -optf test1.optf test_cpp.cu
178     expect_stat 'cache hit (preprocessed)' 1
179     expect_stat 'cache miss' 1
180     expect_stat 'files in cache' 1
181     expect_equal_files reference_test1.o test_cpp.o
182
183     $ccache_nvcc_cpp -optf test2.optf test_cpp.cu
184     expect_stat 'cache hit (preprocessed)' 1
185     expect_stat 'cache miss' 2
186     expect_stat 'files in cache' 2
187     expect_equal_files reference_test2.o test_cpp.o
188
189     $ccache_nvcc_cpp -optf test2.optf test_cpp.cu
190     expect_stat 'cache hit (preprocessed)' 2
191     expect_stat 'cache miss' 2
192     expect_stat 'files in cache' 2
193     expect_equal_files reference_test2.o test_cpp.o
194
195     # -------------------------------------------------------------------------
196     TEST "Option --compiler-bindir"
197
198     $REAL_NVCC $nvcc_opts_cpp --compiler-bindir $REAL_COMPILER_BIN \
199       -o reference_test1.o test_cpp.cu
200
201     # First compile.
202     $ccache_nvcc_cpp --compiler-bindir $REAL_COMPILER_BIN test_cpp.cu
203     expect_stat 'cache hit (preprocessed)' 0
204     expect_stat 'cache miss' 1
205     expect_stat 'files in cache' 1
206     expect_equal_files reference_test1.o test_cpp.o
207
208     $ccache_nvcc_cpp --compiler-bindir $REAL_COMPILER_BIN test_cpp.cu
209     expect_stat 'cache hit (preprocessed)' 1
210     expect_stat 'cache miss' 1
211     expect_stat 'files in cache' 1
212     expect_equal_files reference_test1.o test_cpp.o
213
214     # -------------------------------------------------------------------------
215     TEST "Option -ccbin"
216
217     $REAL_NVCC $nvcc_opts_cpp -ccbin $REAL_COMPILER_BIN \
218       -o reference_test1.o test_cpp.cu
219
220     # First compile.
221     $ccache_nvcc_cpp -ccbin $REAL_COMPILER_BIN test_cpp.cu
222     expect_stat 'cache hit (preprocessed)' 0
223     expect_stat 'cache miss' 1
224     expect_stat 'files in cache' 1
225     expect_equal_files reference_test1.o test_cpp.o
226
227     $ccache_nvcc_cpp -ccbin $REAL_COMPILER_BIN test_cpp.cu
228     expect_stat 'cache hit (preprocessed)' 1
229     expect_stat 'cache miss' 1
230     expect_stat 'files in cache' 1
231     expect_equal_files reference_test1.o test_cpp.o
232
233     # -------------------------------------------------------------------------
234     TEST "Option --output-directory"
235
236     $REAL_NVCC $nvcc_opts_cpp --output-directory . \
237       -o reference_test1.o test_cpp.cu
238
239     # First compile.
240     $ccache_nvcc_cpp --output-directory . test_cpp.cu
241     expect_stat 'cache hit (preprocessed)' 0
242     expect_stat 'cache miss' 1
243     expect_stat 'files in cache' 1
244     expect_equal_files reference_test1.o test_cpp.o
245
246     $ccache_nvcc_cpp --output-directory . test_cpp.cu
247     expect_stat 'cache hit (preprocessed)' 1
248     expect_stat 'cache miss' 1
249     expect_stat 'files in cache' 1
250     expect_equal_files reference_test1.o test_cpp.o
251
252     # -------------------------------------------------------------------------
253     TEST "Option -odir"
254
255     $REAL_NVCC $nvcc_opts_cpp -odir . -o reference_test1.o test_cpp.cu
256
257     # First compile.
258     $ccache_nvcc_cpp -odir . test_cpp.cu
259     expect_stat 'cache hit (preprocessed)' 0
260     expect_stat 'cache miss' 1
261     expect_stat 'files in cache' 1
262     expect_equal_files reference_test1.o test_cpp.o
263
264     $ccache_nvcc_cpp -odir . test_cpp.cu
265     expect_stat 'cache hit (preprocessed)' 1
266     expect_stat 'cache miss' 1
267     expect_stat 'files in cache' 1
268     expect_equal_files reference_test1.o test_cpp.o
269 }
270
271 SUITE_nvcc_PROBE() {
272     nvcc_PROBE
273 }
274
275 SUITE_nvcc_SETUP() {
276     nvcc_SETUP
277 }
278
279 SUITE_nvcc() {
280     nvcc_tests
281 }