Skip to content

Commit 4942a19

Browse files
committed
progress on tests
1 parent fc6dbc5 commit 4942a19

File tree

8 files changed

+280
-0
lines changed

8 files changed

+280
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from cuda.core.experimental._context import Context
2+
3+
def test_context_initialization():
4+
try:
5+
context = Context()
6+
except NotImplementedError as e:
7+
assert True
8+
else:
9+
assert False, "Expected NotImplementedError was not raised"
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from cuda import cuda, cudart
2+
from cuda.core.experimental._device import Device
3+
from cuda.core.experimental._utils import handle_return, ComputeCapability, CUDAError, \
4+
precondition
5+
6+
def test_device_initialization():
7+
device = Device()
8+
assert device is not None
9+
10+
def test_device_repr():
11+
device = Device()
12+
assert str(device).startswith('<Device 0')
13+
14+
def test_device_set_current():
15+
device = Device()
16+
device.set_current()
17+
18+
def test_device_create_stream():
19+
device = Device()
20+
stream = device.create_stream()
21+
assert stream is not None
22+
23+
24+
def test_pci_bus_id():
25+
device = Device(0)
26+
bus_id = handle_return(cudart.cudaDeviceGetPCIBusId(13, device.device_id))
27+
assert device.pci_bus_id == bus_id[:12].decode()
28+
29+
def test_uuid():
30+
device = Device(0)
31+
driver_ver = handle_return(cuda.cuDriverGetVersion())
32+
if driver_ver >= 11040:
33+
uuid = handle_return(cuda.cuDeviceGetUuid_v2(device.device_id))
34+
else:
35+
uuid = handle_return(cuda.cuDeviceGetUuid(device.device_id))
36+
uuid = uuid.bytes.hex()
37+
expected_uuid = f"{uuid[:8]}-{uuid[8:12]}-{uuid[12:16]}-{uuid[16:20]}-{uuid[20:]}"
38+
assert device.uuid == expected_uuid
39+
40+
def test_name():
41+
device = Device(0)
42+
name = handle_return(cuda.cuDeviceGetName(128, device.device_id))
43+
name = name.split(b'\0')[0]
44+
assert device.name == name.decode()
45+
46+
def test_compute_capability():
47+
device = Device(0)
48+
major = handle_return(cudart.cudaDeviceGetAttribute(
49+
cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMajor, device.device_id))
50+
minor = handle_return(cudart.cudaDeviceGetAttribute(
51+
cudart.cudaDeviceAttr.cudaDevAttrComputeCapabilityMinor, device.device_id))
52+
expected_cc = ComputeCapability(major, minor)
53+
assert device.compute_capability == expected_cc
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from cuda import cuda
2+
from cuda.core.experimental._event import EventOptions, Event
3+
from cuda.core.experimental._utils import handle_return
4+
5+
def test_is_timing_disabled():
6+
options = EventOptions(enable_timing=False)
7+
event = Event._init(options)
8+
assert event.is_timing_disabled == True
9+
10+
def test_is_sync_busy_waited():
11+
options = EventOptions(busy_waited_sync=True)
12+
event = Event._init(options)
13+
assert event.is_sync_busy_waited == True
14+
15+
def test_is_ipc_supported():
16+
options = EventOptions(support_ipc=True)
17+
try:
18+
event = Event._init(options)
19+
except NotImplementedError:
20+
assert True
21+
else:
22+
assert False
23+
24+
def test_sync():
25+
options = EventOptions()
26+
event = Event._init(options)
27+
event.sync()
28+
assert event.is_done == True
29+
30+
def test_is_done():
31+
options = EventOptions()
32+
event = Event._init(options)
33+
assert event.is_done == True
34+
35+
def test_handle():
36+
options = EventOptions()
37+
event = Event._init(options)
38+
assert isinstance(event.handle, int)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from cuda.core.experimental._launcher import LaunchConfig
2+
from cuda.core.experimental._stream import Stream
3+
from cuda.core.experimental._device import Device
4+
from cuda.core.experimental._utils import handle_return
5+
from cuda import cuda
6+
7+
def test_launch_config_init():
8+
config = LaunchConfig(grid=(1, 1, 1), block=(1, 1, 1), stream=None, shmem_size=0)
9+
assert config.grid == (1, 1, 1)
10+
assert config.block == (1, 1, 1)
11+
assert config.stream is None
12+
assert config.shmem_size == 0
13+
14+
config = LaunchConfig(grid=(2, 2, 2), block=(2, 2, 2), stream=Device().create_stream(), shmem_size=1024)
15+
assert config.grid == (2, 2, 2)
16+
assert config.block == (2, 2, 2)
17+
assert isinstance(config.stream, Stream)
18+
assert config.shmem_size == 1024
19+
20+
def test_launch_config_cast_to_3_tuple():
21+
config = LaunchConfig(grid=1, block=1)
22+
assert config._cast_to_3_tuple(1) == (1, 1, 1)
23+
assert config._cast_to_3_tuple((1, 2)) == (1, 2, 1)
24+
assert config._cast_to_3_tuple((1, 2, 3)) == (1, 2, 3)
25+
26+
# Edge cases
27+
assert config._cast_to_3_tuple(999) == (999, 1, 1)
28+
assert config._cast_to_3_tuple((999, 888)) == (999, 888, 1)
29+
assert config._cast_to_3_tuple((999, 888, 777)) == (999, 888, 777)
30+
31+
def test_launch_config_invalid_values():
32+
try:
33+
LaunchConfig(grid=0, block=1)
34+
except ValueError:
35+
assert True
36+
else:
37+
assert False
38+
39+
try:
40+
LaunchConfig(grid=(0, 1), block=1)
41+
except ValueError:
42+
assert True
43+
else:
44+
assert False
45+
46+
try:
47+
LaunchConfig(grid=(1, 1, 1), block=0)
48+
except ValueError:
49+
assert True
50+
else:
51+
assert False
52+
53+
try:
54+
LaunchConfig(grid=(1, 1, 1), block=(0, 1))
55+
except ValueError:
56+
assert True
57+
else:
58+
assert False
59+
60+
def test_launch_config_stream():
61+
stream = Device().create_stream()
62+
config = LaunchConfig(grid=(1, 1, 1), block=(1, 1, 1), stream=stream, shmem_size=0)
63+
assert config.stream == stream
64+
65+
try:
66+
LaunchConfig(grid=(1, 1, 1), block=(1, 1, 1), stream="invalid_stream", shmem_size=0)
67+
except ValueError:
68+
assert True
69+
else:
70+
assert False
71+
72+
def test_launch_config_shmem_size():
73+
config = LaunchConfig(grid=(1, 1, 1), block=(1, 1, 1), stream=None, shmem_size=2048)
74+
assert config.shmem_size == 2048
75+
76+
config = LaunchConfig(grid=(1, 1, 1), block=(1, 1, 1), stream=None)
77+
assert config.shmem_size == 0
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# FILE: test_memory.py
2+
3+
from cuda.core.experimental._memory import Buffer, MemoryResource
4+
from cuda.core.experimental._device import Device
5+
from cuda import cuda
6+
from cuda.core.experimental._utils import handle_return
7+
8+
class DummyMemoryResource(MemoryResource):
9+
def __init__(self):
10+
pass
11+
12+
def allocate(self, size, stream=None) -> Buffer:
13+
ptr = handle_return(cuda.cuMemAlloc(size))
14+
return Buffer(ptr=ptr, size=size, mr=self)
15+
16+
def deallocate(self, ptr, size, stream=None):
17+
handle_return(cuda.cuMemFree(ptr))
18+
19+
@property
20+
def is_device_accessible(self) -> bool:
21+
return True
22+
23+
@property
24+
def is_host_accessible(self) -> bool:
25+
return True
26+
27+
@property
28+
def device_id(self) -> int:
29+
return 0
30+
31+
def test_buffer_initialization():
32+
dummy_mr = DummyMemoryResource()
33+
buffer = dummy_mr.allocate(size=1024)
34+
assert buffer.handle != 0
35+
assert buffer.size == 1024
36+
assert buffer.memory_resource == dummy_mr
37+
assert buffer.is_device_accessible == True
38+
assert buffer.is_host_accessible == True
39+
assert buffer.device_id == 0
40+
dummy_mr.deallocate(buffer.handle, buffer.size)
41+
42+
def test_buffer_copy_to():
43+
dummy_mr = DummyMemoryResource()
44+
src_buffer = dummy_mr.allocate(size=1024)
45+
dst_buffer = dummy_mr.allocate(size=1024)
46+
device = Device()
47+
device.set_current()
48+
stream = device.create_stream()
49+
src_buffer.copy_to(dst_buffer, stream=stream)
50+
# Assuming cuMemcpyAsync is correctly called, we can't directly check the result here
51+
dummy_mr.deallocate(src_buffer.handle, src_buffer.size)
52+
dummy_mr.deallocate(dst_buffer.handle, dst_buffer.size)
53+
54+
def test_buffer_copy_from():
55+
dummy_mr = DummyMemoryResource()
56+
src_buffer = dummy_mr.allocate(size=1024)
57+
dst_buffer = dummy_mr.allocate(size=1024)
58+
device = Device()
59+
device.set_current()
60+
stream = device.create_stream()
61+
dst_buffer.copy_from(src_buffer, stream=stream)
62+
# Assuming cuMemcpyAsync is correctly called, we can't directly check the result here
63+
dummy_mr.deallocate(src_buffer.handle, src_buffer.size)
64+
dummy_mr.deallocate(dst_buffer.handle, dst_buffer.size)
65+
66+
def test_buffer_close():
67+
dummy_mr = DummyMemoryResource()
68+
buffer = dummy_mr.allocate(size=1024)
69+
buffer.close()
70+
assert buffer.handle == 0
71+
assert buffer.memory_resource == None
72+
73+
test_buffer_initialization()
74+
test_buffer_copy_to()
75+
test_buffer_copy_from()
76+
test_buffer_close()
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from cuda.core.experimental._module import ObjectCode
2+
3+
def test_module_initialization():
4+
module_code = b"dummy_code"
5+
code_type = "ptx"
6+
module = ObjectCode(module=module_code, code_type=code_type)
7+
assert module._handle is not None
8+
assert module._code_type == code_type
9+
assert module._module == module_code
10+
assert module._loader is not None
11+
assert module._sym_map == {}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from cuda.core.experimental._program import Program
2+
3+
def test_program_initialization():
4+
code = "__device__ int test_func() { return 0; }"
5+
program = Program(code, "c++")
6+
assert program._handle is not None
7+
assert program._backend == "nvrtc"
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from cuda.core.experimental._stream import Stream
2+
3+
def test_stream_initialization():
4+
try:
5+
stream = Stream()
6+
except NotImplementedError as e:
7+
assert True
8+
else:
9+
assert False, "Expected NotImplementedError was not raised"

0 commit comments

Comments
 (0)