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

1import pytest 

2from gpaw.xc import XC 

3from gpaw.gpu import cupy as cp, cupy_is_fake 

4 

5 

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,)) 

19 

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) 

32 

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) 

48 

49 

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,)) 

60 

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) 

71 

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) 

80 

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)