Skip to content

Commit e36241a

Browse files
Merge pull request #213 from NVIDIA/ksimpson/public_entrypoint_testing_196
Clean up testsuite
2 parents 6820f30 + 8daac0e commit e36241a

File tree

10 files changed

+115
-95
lines changed

10 files changed

+115
-95
lines changed

cuda_core/tests/conftest.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,29 @@
55
# this software. Any use, reproduction, disclosure, or distribution of
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
8+
try:
9+
from cuda.bindings import driver
10+
except ImportError:
11+
from cuda import cuda as driver
812

9-
from cuda.core.experimental._device import Device
13+
from cuda.core.experimental import Device
14+
from cuda.core.experimental import _device
15+
from cuda.core.experimental._utils import handle_return
1016
import pytest
1117

12-
@pytest.fixture(scope="module")
18+
@pytest.fixture(scope="function")
1319
def init_cuda():
1420
device = Device()
1521
device.set_current()
16-
22+
yield
23+
_device_unset_current()
24+
25+
def _device_unset_current():
26+
handle_return(driver.cuCtxPopCurrent())
27+
with _device._tls_lock:
28+
del _device._tls.devices
29+
30+
@pytest.fixture(scope="function")
31+
def deinit_cuda():
32+
yield
33+
_device_unset_current()

cuda_core/tests/example_tests/test_basic_examples.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@
2020
'example', sample_files
2121
)
2222
class TestExamples:
23-
def test_example(self, example):
23+
def test_example(self, example, deinit_cuda):
2424
filename = os.path.basename(example)
2525
run_example(samples_path, example)

cuda_core/tests/example_tests/utils.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda import cuda
109
import gc
1110
import os
1211
import sys

cuda_core/tests/test_device.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,20 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda import cuda, cudart
10-
from cuda.core.experimental._device import Device
11-
from cuda.core.experimental._utils import handle_return, ComputeCapability, CUDAError, \
12-
precondition
13-
import pytest
9+
try:
10+
from cuda.bindings import driver, runtime
11+
except ImportError:
12+
from cuda import cuda as driver
13+
from cuda import cudart as runtime
1414

15+
from cuda.core.experimental import Device
16+
from cuda.core.experimental._utils import handle_return, ComputeCapability
17+
18+
def test_device_set_current(deinit_cuda):
19+
device = Device()
20+
device.set_current()
21+
assert handle_return(driver.cuCtxGetCurrent()) is not None
22+
1523
def test_device_repr():
1624
device = Device(0)
1725
assert str(device).startswith('<Device 0')
@@ -24,44 +32,40 @@ def test_device_alloc(init_cuda):
2432
assert buffer.size == 1024
2533
assert buffer.device_id == 0
2634

27-
def test_device_set_current():
28-
device = Device()
29-
device.set_current()
30-
31-
def test_device_create_stream():
35+
def test_device_create_stream(init_cuda):
3236
device = Device()
3337
stream = device.create_stream()
3438
assert stream is not None
3539
assert stream.handle
3640

3741
def test_pci_bus_id():
3842
device = Device()
39-
bus_id = handle_return(cudart.cudaDeviceGetPCIBusId(13, device.device_id))
43+
bus_id = handle_return(runtime.cudaDeviceGetPCIBusId(13, device.device_id))
4044
assert device.pci_bus_id == bus_id[:12].decode()
4145

4246
def test_uuid():
4347
device = Device()
44-
driver_ver = handle_return(cuda.cuDriverGetVersion())
48+
driver_ver = handle_return(driver.cuDriverGetVersion())
4549
if driver_ver >= 11040:
46-
uuid = handle_return(cuda.cuDeviceGetUuid_v2(device.device_id))
50+
uuid = handle_return(driver.cuDeviceGetUuid_v2(device.device_id))
4751
else:
48-
uuid = handle_return(cuda.cuDeviceGetUuid(device.device_id))
52+
uuid = handle_return(driver.cuDeviceGetUuid(device.device_id))
4953
uuid = uuid.bytes.hex()
5054
expected_uuid = f"{uuid[:8]}-{uuid[8:12]}-{uuid[12:16]}-{uuid[16:20]}-{uuid[20:]}"
5155
assert device.uuid == expected_uuid
5256

5357
def test_name():
5458
device = Device()
55-
name = handle_return(cuda.cuDeviceGetName(128, device.device_id))
59+
name = handle_return(driver.cuDeviceGetName(128, device.device_id))
5660
name = name.split(b'\0')[0]
5761
assert device.name == name.decode()
5862

5963
def test_compute_capability():
6064
device = Device()
61-
major = handle_return(cudart.cudaDeviceGetAttribute(
62-
cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMajor, device.device_id))
63-
minor = handle_return(cudart.cudaDeviceGetAttribute(
64-
cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMinor, device.device_id))
65+
major = handle_return(runtime.cudaDeviceGetAttribute(
66+
runtime.cudaDeviceAttr.cudaDevAttrComputeCapabilityMajor, device.device_id))
67+
minor = handle_return(runtime.cudaDeviceGetAttribute(
68+
runtime.cudaDeviceAttr.cudaDevAttrComputeCapabilityMinor, device.device_id))
6569
expected_cc = ComputeCapability(major, minor)
6670
assert device.compute_capability == expected_cc
6771

cuda_core/tests/test_event.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,38 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda import cuda
10-
from cuda.core.experimental._event import EventOptions, Event
11-
from cuda.core.experimental._utils import handle_return
12-
from cuda.core.experimental._device import Device
9+
from cuda.core.experimental import Device, EventOptions
1310
import pytest
1411

15-
def test_is_timing_disabled():
16-
options = EventOptions(enable_timing=False)
17-
event = Event._init(options)
18-
assert event.is_timing_disabled == True
12+
@pytest.mark.parametrize("enable_timing", [True, False, None])
13+
def test_timing(init_cuda, enable_timing):
14+
options = EventOptions(enable_timing=enable_timing)
15+
stream = Device().create_stream()
16+
event = stream.record(options=options)
17+
assert event.is_timing_disabled == (not enable_timing if enable_timing is not None else True)
18+
1919

20-
def test_is_sync_busy_waited():
21-
options = EventOptions(busy_waited_sync=True)
22-
event = Event._init(options)
20+
def test_is_sync_busy_waited(init_cuda):
21+
options = EventOptions(enable_timing=False, busy_waited_sync=True)
22+
stream = Device().create_stream()
23+
event = stream.record(options=options)
2324
assert event.is_sync_busy_waited == True
2425

25-
def test_sync():
26-
options = EventOptions()
27-
event = Event._init(options)
26+
options = EventOptions(enable_timing=False)
27+
stream = Device().create_stream()
28+
event = stream.record(options=options)
29+
assert event.is_sync_busy_waited == False
30+
31+
def test_sync(init_cuda):
32+
options = EventOptions(enable_timing=False)
33+
stream = Device().create_stream()
34+
event = stream.record(options=options)
2835
event.sync()
2936
assert event.is_done == True
3037

31-
def test_is_done():
32-
options = EventOptions()
33-
event = Event._init(options)
38+
def test_is_done(init_cuda):
39+
options = EventOptions(enable_timing=False)
40+
stream = Device().create_stream()
41+
event = stream.record(options=options)
3442
assert event.is_done == True
3543

36-
def test_handle():
37-
options = EventOptions()
38-
event = Event._init(options)
39-
assert isinstance(event.handle, int)

cuda_core/tests/test_launcher.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,10 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda import cuda
10-
from cuda.core.experimental._launcher import LaunchConfig
11-
from cuda.core.experimental._stream import Stream
12-
from cuda.core.experimental._device import Device
13-
from cuda.core.experimental._utils import handle_return
9+
from cuda.core.experimental import Device, Stream, LaunchConfig
1410
import pytest
1511

16-
def test_launch_config_init():
12+
def test_launch_config_init(init_cuda):
1713
config = LaunchConfig(grid=(1, 1, 1), block=(1, 1, 1), stream=None, shmem_size=0)
1814
assert config.grid == (1, 1, 1)
1915
assert config.block == (1, 1, 1)
@@ -50,7 +46,7 @@ def test_launch_config_invalid_values():
5046
with pytest.raises(ValueError):
5147
LaunchConfig(grid=(1, 1, 1), block=(0, 1))
5248

53-
def test_launch_config_stream():
49+
def test_launch_config_stream(init_cuda):
5450
stream = Device().create_stream()
5551
config = LaunchConfig(grid=(1, 1, 1), block=(1, 1, 1), stream=stream, shmem_size=0)
5652
assert config.stream == stream

cuda_core/tests/test_memory.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda import cuda
9+
try:
10+
from cuda.bindings import driver
11+
except ImportError:
12+
from cuda import cuda as driver
13+
14+
from cuda.core.experimental import Device
1015
from cuda.core.experimental._memory import Buffer, MemoryResource
11-
from cuda.core.experimental._device import Device
1216
from cuda.core.experimental._utils import handle_return
1317
import ctypes
14-
import pytest
1518

1619
class DummyDeviceMemoryResource(MemoryResource):
1720
def __init__(self, device):
@@ -66,11 +69,11 @@ def __init__(self, device):
6669
self.device = device
6770

6871
def allocate(self, size, stream=None) -> Buffer:
69-
ptr = handle_return(cuda.cuMemAllocManaged(size, cuda.CUmemAttach_flags.CU_MEM_ATTACH_GLOBAL.value))
72+
ptr = handle_return(driver.cuMemAllocManaged(size, driver.CUmemAttach_flags.CU_MEM_ATTACH_GLOBAL.value))
7073
return Buffer(ptr=ptr, size=size, mr=self)
7174

7275
def deallocate(self, ptr, size, stream=None):
73-
handle_return(cuda.cuMemFree(ptr))
76+
handle_return(driver.cuMemFree(ptr))
7477

7578
@property
7679
def is_device_accessible(self) -> bool:
@@ -89,11 +92,11 @@ def __init__(self, device):
8992
self.device = device
9093

9194
def allocate(self, size, stream=None) -> Buffer:
92-
ptr = handle_return(cuda.cuMemAllocHost(size))
95+
ptr = handle_return(driver.cuMemAllocHost(size))
9396
return Buffer(ptr=ptr, size=size, mr=self)
9497

9598
def deallocate(self, ptr, size, stream=None):
96-
handle_return(cuda.cuMemFreeHost(ptr))
99+
handle_return(driver.cuMemFreeHost(ptr))
97100

98101
@property
99102
def is_device_accessible(self) -> bool:

cuda_core/tests/test_module.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda import cuda
10-
from cuda.core.experimental._device import Device
11-
from cuda.core.experimental._module import Kernel, ObjectCode
12-
from cuda.core.experimental._utils import handle_return
9+
from cuda.core.experimental._module import ObjectCode
1310
import pytest
1411
import importlib
1512

cuda_core/tests/test_program.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda.core.experimental._program import Program
9+
from cuda.core.experimental import Program
1010
from cuda.core.experimental._module import ObjectCode, Kernel
11-
from cuda.core.experimental._device import Device
1211
import pytest
1312

1413
def test_program_init_valid_code_type():

cuda_core/tests/test_stream.py

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,68 +6,69 @@
66
# this software and related documentation outside the terms of the EULA
77
# is strictly prohibited.
88

9-
from cuda.core.experimental._stream import Stream, StreamOptions, LEGACY_DEFAULT_STREAM, PER_THREAD_DEFAULT_STREAM, default_stream
10-
from cuda.core.experimental._event import Event, EventOptions
11-
from cuda.core.experimental._device import Device
9+
from cuda.core.experimental import Device, Stream, StreamOptions
10+
from cuda.core.experimental._stream import LEGACY_DEFAULT_STREAM, PER_THREAD_DEFAULT_STREAM, default_stream
11+
from cuda.core.experimental._event import Event
1212
import pytest
1313

1414
def test_stream_init():
1515
with pytest.raises(NotImplementedError):
1616
Stream()
1717

18-
def test_stream_init_with_options():
19-
stream = Stream._init(options=StreamOptions(nonblocking=True, priority=0))
18+
def test_stream_init_with_options(init_cuda):
19+
stream = Device().create_stream(options=StreamOptions(nonblocking=True, priority=0))
2020
assert stream.is_nonblocking is True
2121
assert stream.priority == 0
2222

23-
def test_stream_handle():
24-
stream = Stream._init(options=StreamOptions())
23+
def test_stream_handle(init_cuda):
24+
stream = Device().create_stream(options=StreamOptions())
2525
assert isinstance(stream.handle, int)
2626

27-
def test_stream_is_nonblocking():
28-
stream = Stream._init(options=StreamOptions(nonblocking=True))
27+
def test_stream_is_nonblocking(init_cuda):
28+
stream = Device().create_stream(options=StreamOptions(nonblocking=True))
2929
assert stream.is_nonblocking is True
3030

31-
def test_stream_priority():
32-
stream = Stream._init(options=StreamOptions(priority=0))
31+
def test_stream_priority(init_cuda):
32+
stream = Device().create_stream(options=StreamOptions(priority=0))
3333
assert stream.priority == 0
34-
stream = Stream._init(options=StreamOptions(priority=-1))
34+
stream = Device().create_stream(options=StreamOptions(priority=-1))
3535
assert stream.priority == -1
3636
with pytest.raises(ValueError):
37-
stream = Stream._init(options=StreamOptions(priority=1))
37+
stream = Device().create_stream(options=StreamOptions(priority=1))
3838

39-
def test_stream_sync():
40-
stream = Stream._init(options=StreamOptions())
39+
def test_stream_sync(init_cuda):
40+
stream = Device().create_stream(options=StreamOptions())
4141
stream.sync() # Should not raise any exceptions
4242

43-
def test_stream_record():
44-
stream = Stream._init(options=StreamOptions())
43+
def test_stream_record(init_cuda):
44+
stream = Device().create_stream(options=StreamOptions())
4545
event = stream.record()
4646
assert isinstance(event, Event)
4747

48-
def test_stream_record_invalid_event():
49-
stream = Stream._init(options=StreamOptions())
48+
def test_stream_record_invalid_event(init_cuda):
49+
stream = Device().create_stream(options=StreamOptions())
5050
with pytest.raises(TypeError):
5151
stream.record(event="invalid_event")
5252

53-
def test_stream_wait_event():
54-
stream = Stream._init(options=StreamOptions())
55-
event = Event._init()
56-
stream.record(event)
57-
stream.wait(event) # Should not raise any exceptions
53+
def test_stream_wait_event(init_cuda):
54+
s1 = Device().create_stream()
55+
s2 = Device().create_stream()
56+
e1 = s1.record()
57+
s2.wait(e1) # Should not raise any exceptions
58+
s2.sync()
5859

59-
def test_stream_wait_invalid_event():
60-
stream = Stream._init(options=StreamOptions())
60+
def test_stream_wait_invalid_event(init_cuda):
61+
stream = Device().create_stream(options=StreamOptions())
6162
with pytest.raises(ValueError):
6263
stream.wait(event_or_stream="invalid_event")
6364

64-
def test_stream_device():
65-
stream = Stream._init(options=StreamOptions())
65+
def test_stream_device(init_cuda):
66+
stream = Device().create_stream(options=StreamOptions())
6667
device = stream.device
6768
assert isinstance(device, Device)
6869

69-
def test_stream_context():
70-
stream = Stream._init(options=StreamOptions())
70+
def test_stream_context(init_cuda):
71+
stream = Device().create_stream(options=StreamOptions())
7172
context = stream.context
7273
assert context is not None
7374

0 commit comments

Comments
 (0)