Coverage for gpaw/test/gpu/test_xc_gpu.py: 15%
71 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
1import pytest
2from gpaw.xc import XC
3from gpaw.gpu import cupy as cp, cupy_is_fake
6@pytest.mark.gpu
7@pytest.mark.skipif(cupy_is_fake, reason='No cupy')
8@pytest.mark.parametrize('nspins', [1, 2])
9def test_gpu_pbe(nspins):
10 from gpaw.cgpaw import evaluate_pbe_gpu
11 ng = 10000
12 n_sg = cp.exp(cp.log(10) * 5 * (cp.random.rand(nspins, ng) - 0.5))
13 sigma_xg = cp.exp(cp.log(10) * 5 * (
14 cp.random.rand(2 * nspins - 1, ng) - 0.5))
15 dedsigma_xg = cp.zeros_like(sigma_xg)
16 cp.cuda.runtime.deviceSynchronize()
17 v_sg = cp.zeros_like(n_sg)
18 e_g = cp.zeros((ng,))
20 cpun_sg = cp.asnumpy(n_sg)
21 cpuv_sg = cp.asnumpy(v_sg)
22 cpue_g = cp.asnumpy(e_g)
23 cpusigma_xg = cp.asnumpy(sigma_xg)
24 cpudedsigma_xg = cp.asnumpy(dedsigma_xg)
25 xc = XC('PBE')
26 import time
27 start = time.time()
28 xc.kernel.calculate(cpue_g, cpun_sg, cpuv_sg, cpusigma_xg, cpudedsigma_xg)
29 stop = time.time()
30 cpu = stop - start
31 print('CPU took', stop - start)
33 cp.cuda.runtime.deviceSynchronize()
34 start = time.time()
35 evaluate_pbe_gpu(n_sg, v_sg, e_g, sigma_xg, dedsigma_xg)
36 cp.cuda.runtime.deviceSynchronize()
37 stop = time.time()
38 print('GPU took', stop - start)
39 gpu = stop - start
40 print('speedup', cpu / gpu)
41 print('max error v_g', cp.max(cp.abs(v_sg - cp.asarray(cpuv_sg)).ravel()))
42 assert cp.allclose(v_sg, cpuv_sg, atol=1e-7, rtol=1e-13)
43 print('max error dedsigmax_g',
44 cp.max(cp.abs(dedsigma_xg - cp.asarray(cpudedsigma_xg)).ravel()))
45 assert cp.allclose(dedsigma_xg, cpudedsigma_xg, atol=1e-7, rtol=1e-13)
46 print('max error e_g', cp.max(cp.abs(e_g - cp.asarray(cpue_g)).ravel()))
47 assert cp.allclose(e_g, cpue_g, atol=1e-12, rtol=1e-12)
50@pytest.mark.gpu
51@pytest.mark.skipif(cupy_is_fake, reason='No cupy')
52@pytest.mark.parametrize('nspins', [1, 2])
53def test_gpu_lda(nspins):
54 from gpaw.cgpaw import evaluate_lda_gpu
55 ng = 10000
56 n_sg = cp.exp(cp.log(10) * 5 * (cp.random.rand(nspins, ng) - 0.5))
57 cp.cuda.runtime.deviceSynchronize()
58 v_sg = cp.zeros_like(n_sg)
59 e_g = cp.zeros((ng,))
61 cpun_sg = cp.asnumpy(n_sg)
62 cpuv_sg = cp.asnumpy(v_sg)
63 cpue_g = cp.asnumpy(e_g)
64 xc = XC('LDA')
65 import time
66 start = time.time()
67 xc.calculate_impl(None, cpun_sg, cpuv_sg, cpue_g)
68 stop = time.time()
69 cpu = stop - start
70 print('CPU took', stop - start)
72 cp.cuda.runtime.deviceSynchronize()
73 start = time.time()
74 evaluate_lda_gpu(n_sg, v_sg, e_g)
75 cp.cuda.runtime.deviceSynchronize()
76 stop = time.time()
77 print('GPU took', stop - start)
78 gpu = stop - start
79 print('speedup', cpu / gpu)
81 assert cp.allclose(v_sg, cpuv_sg, atol=1e-13, rtol=1e-13)
82 assert cp.allclose(e_g, cpue_g, atol=1e-14, rtol=1e-14)