Skip to content

Commit 3063dbe

Browse files
Merge branch 'main' into IPC
2 parents f20cdda + acff0c5 commit 3063dbe

File tree

2 files changed

+147
-52
lines changed

2 files changed

+147
-52
lines changed

cuda_bindings/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ tomli; python_version < "3.11"
88
versioneer==0.29
99
wheel
1010
pywin32; sys_platform == 'win32'
11+
# llvmlite # Uncomment to generate MINIMAL_NVVMIR_BITCODE_STATIC for test_nvvm.py (see PR #443).

cuda_bindings/tests/test_nvvm.py

Lines changed: 146 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,23 @@
22
#
33
# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE
44

5-
import base64
5+
import binascii
66
import re
7+
import textwrap
78
from contextlib import contextmanager
89

910
import pytest
1011

1112
from cuda.bindings import nvvm
1213

14+
MINIMAL_NVVMIR_FIXTURE_PARAMS = ["txt", "bitcode_static"]
15+
try:
16+
import llvmlite.binding as llvmlite_binding # Optional test dependency.
17+
except ImportError:
18+
llvmlite_binding = None
19+
else:
20+
MINIMAL_NVVMIR_FIXTURE_PARAMS.append("bitcode_dynamic")
21+
1322
MINIMAL_NVVMIR_TXT = b"""\
1423
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64"
1524
@@ -24,56 +33,141 @@
2433
!0 = !{void ()* @kernel, !"kernel", i32 1}
2534
2635
!nvvmir.version = !{!1}
27-
!1 = !{i32 2, i32 0, i32 3, i32 1}
36+
!1 = !{i32 %d, i32 0, i32 %d, i32 0}
2837
""" # noqa: E501
2938

30-
# Equivalent to MINIMAL_NVVMIR_TXT
31-
MINIMAL_NVVMIR_BITCODE = base64.b64decode("""
32-
QkPA3jUUAAAFAAAAYgwwJElZvmbu034tRAEyBQAAAAAhDAAAJAEAAAsCIQACAAAAEwAAAAeBI5FB
33-
yARJBhAyOZIBhAwlBQgZHgSLYoAMRQJCkgtCZBAyFDgIGEsKMjKISJAUIENGiKUAGTJC5EgOkJEh
34-
xFBBUYGM4YPligQZRgaJIAAACwAAADIiyAggZIUEkyGkhASTIeOEoZAUEkyGjAuEZEwQFCMAJQBl
35-
IGCOAAwAAAAAEyZ3sAd4oAd8sAM6aAN3sId0IId0CIc2GId6IIdw2OAS5dAG8KAHdkAHemAHdKAH
36-
dkAHbZAOcaAHeKAHeNAG6YAHeoAHeoAHbZAOcWAHehAHdqAHcWAHbZAOcyAHejAHcqAHcyAHbZAO
37-
dkAHemAHdKAHdkAHbZAOcSAHeKAHcSAHeKAHcSAHeNAG5jAHcqAHcyAHejAHctAG5mAHdKAHdkAH
38-
emAHdNAG9hAHdqAHcWAHehAHdtAG9jAHcqAHcyAHejAHctAG9mAHdKAHdkAHemAHdNAG9hAHcoAH
39-
ehAHcoAHehAHcoAHbeAOcWAHejAHcqAHdkAHGiEMGTFIgzDA8jdVxSCRvyxDIsAIAAAAAAAAAAAA
40-
AEBig0BRlAAAgCwQBgAAADIemAwZEUyQjAkmR8YEQ2IJFMEIQBkAALEYAABtAAAAMwiAHMThHGYU
41-
AT2IQziEw4xCgAd5eAdzmHEM5gAP7RAO9IAOMwxCHsLBHc6hHGYwBT2IQziEgxvMAz3IQz2MAz3M
42-
eIx0cAd7CAd5SIdwcAd6cAN2eIdwIIcZzBEO7JAO4TAPbjAP4/AO8FAOMxDEHd4hHNghHcJhHmYw
43-
iTu8gzvQQzm0Azy8gzyEAzvM8BR2YAd7aAc3aIdyaAc3gIdwkIdwYAd2KAd2+AV2eId3gIdfCIdx
44-
GIdymId5mIEs7vAO7uAO9cAO7DADYsihHOShHMyhHOShHNxhHMohHMSBHcphBtaQQznIQzmYQznI
45-
Qzm4wziUQziIAzuUwy+8gzz8gjvUAzuwwwzHaYdwWIdycIN0aAd4YId0GId0oIcZzlMP7gAP8lAO
46-
5JAO40AP4SAO7FAOMyAoHdzBHsJBHtIhHNyBHtzgHOThHeoBHmYYUTiwQzqcgzvMUCR2YAd7aAc3
47-
YId3eAd4mFFM9JAP8FAOMx5qHsphHOghHd7BHX4BHuShHMwhHfBhBlSFgzjMwzuwQz3QQzn8wjzk
48-
QzuIwzuww4zFCod5mId3GId0CAd6KAdyAAAAAHkgAAAeAAAAYh5IIEOIDBk5GSSQkUDGyMhoIlAI
49-
FDKeGBkhR8iQUQwIBQAABgAAAGtlcm5lbAAAIwgCMIJABCMIhDCCQAwjCAQxwyAEwwwEURiDjAQm
50-
KCE3O7s2lzA3tze6MLq0N7e5UQIjHTc7u7Y0ORe7Mrm5tDe3UYIDAAAAqRgAAAsAAAALCnIoh3eA
51-
B3pYcJhDPbjDOLBDOdDDguYcxqEN6EEewsEd5iEd6CEd3sEdANEQAAAGAAAAB8w8pIM7nAM7lAM9
52-
oIM8lEM4kMMBAAAAYSAAAAYAAAATBAGGAwEAAAIAAAAHUBDNFGEAAAAAAABxIAAAAwAAADIOECKE
53-
AKACAAAAAAAAAABlDAAAHQAAABIDlOgAAAAAAAAAAAYAAAAFAAAARAAAAAEAAABQAAAAAAAAAFAA
54-
AAABAAAAaAAAAAAAAAALAAAAEwAAAB4AAAARAAAALwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABgAA
55-
AAAAAAAGAAAA/////wAkAAAAAAAAXQwAAA8AAAASA5RvAAAAAGtlcm5lbDUuMC4xbnZwdHg2NC1u
56-
dmlkaWEtY3VkYW1pbmltYWxfbnZ2bWlyLmxsAAAAAAA=
57-
""")
58-
# To regenerate, pull and start a docker container:
59-
# docker pull centos/llvm-toolset-7-centos7
60-
# docker run -it centos/llvm-toolset-7-centos7 /bin/bash
61-
# In the docker container, copy MINIMAL_NVVMIR_TXT to a file with name minimal_nvvmir.ll
62-
# Then run:
63-
# llvm-as minimal_nvvmir.ll -o minimal_nvvmir.bc
64-
# Save this to encode.py:
65-
# import base64, sys, textwrap
66-
# bitcode = open(sys.argv[1], "rb").read()
67-
# encoded_bitcode = base64.b64encode(bitcode).decode("ascii")
68-
# wrapped_base64 = "\n".join(textwrap.wrap(encoded_bitcode, width=76))
69-
# print(wrapped_base64)
70-
# Then run:
71-
# python encode.py minimal_nvvmir.bc
72-
73-
74-
@pytest.fixture(params=["txt", "bitcode"])
39+
MINIMAL_NVVMIR_BITCODE_STATIC = {
40+
(1, 3): # (major, debug_major)
41+
"4243c0de3514000005000000620c30244a59be669dfbb4bf0b51804c01000000210c00007f010000"
42+
"0b02210002000000160000000781239141c80449061032399201840c250508191e048b62800c4502"
43+
"42920b42641032143808184b0a3232884870c421234412878c1041920264c808b1142043468820c9"
44+
"01323284182a282a90317cb05c9120c3c8000000892000000b0000003222c80820624600212b2498"
45+
"0c212524980c19270c85a4906032645c20246382a01801300128030173046000132677b00778a007"
46+
"7cb0033a680377b0877420877408873618877a208770d8e012e5d006f0a0077640077a600774a007"
47+
"7640076d900e71a00778a00778d006e980077a80077a80076d900e7160077a100776a0077160076d"
48+
"900e7320077a300772a0077320076d900e7640077a600774a0077640076d900e71200778a0077120"
49+
"0778a00771200778d006e6300772a0077320077a300772d006e6600774a0077640077a600774d006"
50+
"f6100776a0077160077a100776d006f6300772a0077320077a300772d006f6600774a0077640077a"
51+
"600774d006f610077280077a10077280077a10077280076de00e7160077a300772a0077640071a21"
52+
"4c0e11de9c2e4fbbcfbe211560040000000000000000000000000620b141a0e86000004016080000"
53+
"06000000321e980c19114c908c092647c6044362098c009401000000b1180000ac0000003308801c"
54+
"c4e11c6614013d88433884c38c4280077978077398710ce6000fed100ef4800e330c421ec2c11dce"
55+
"a11c6630053d88433884831bcc033dc8433d8c033dcc788c7470077b08077948877070077a700376"
56+
"788770208719cc110eec900ee1300f6e300fe3f00ef0500e3310c41dde211cd8211dc2611e663089"
57+
"3bbc833bd04339b4033cbc833c84033bccf0147660077b6807376887726807378087709087706007"
58+
"76280776f8057678877780875f08877118877298877998812ceef00eeee00ef5c00eec300362c8a1"
59+
"1ce4a11ccca11ce4a11cdc611cca211cc4811dca6106d6904339c84339984339c84339b8c3389443"
60+
"3888033b94c32fbc833cfc823bd4033bb0c30cc7698770588772708374680778608774188774a087"
61+
"19ce530fee000ff2500ee4900ee3400fe1200eec500e3320281ddcc11ec2411ed2211cdc811edce0"
62+
"1ce4e11dea011e66185138b0433a9c833bcc50247660077b68073760877778077898514cf4900ff0"
63+
"500e331e6a1eca611ce8211ddec11d7e011ee4a11ccc211df0610654858338ccc33bb0433dd04339"
64+
"fcc23ce4433b88c33bb0c38cc50a877998877718877408077a28077298815ce3100eecc00ee5500e"
65+
"f33023c1d2411ee4e117d8e11dde011e6648193bb0833db4831b84c3388c4339ccc33cb8c139c8c3"
66+
"3bd4033ccc48b471080776600771088771588719dbc60eec600fede006f0200fe5300fe5200ff650"
67+
"0e6e100ee3300ee5300ff3e006e9e00ee4500ef83023e2ec611cc2811dd8e117ec211de6211dc421"
68+
"1dd8211de8211f66209d3bbc433db80339948339cc58bc7070077778077a08077a488777708719cb"
69+
"e70eef300fe1e00ee9400fe9a00fe530c3010373a8077718875f988770708774a08774d087729881"
70+
"844139e0c338b0433d904339cc40c4a01dcaa11de0411edec11c662463300ee1c00eec300fe9400f"
71+
"e5000000792000001d000000721e482043880c19097232482023818c9191d144a01028643c313242"
72+
"8e9021a318100a00060000006b65726e656c0000230802308240042308843082400c330c4230cc40"
73+
"0c4441c84860821272b3b36b730973737ba30ba34b7b739b1b2528d271b3b36b4b9373b12b939b4b"
74+
"7b731b2530000000a9180000250000000b0a7228877780077a587098433db8c338b04339d0c382e6"
75+
"1cc6a10de8411ec2c11de6211de8211ddec11d1634e3600ee7500fe1200fe4400fe1200fe7500ef4"
76+
"b08081077928877060077678877108077a28077258709cc338b4013ba4833d94c3026b1cd8211cdc"
77+
"e11cdc201ce4611cdc201ce8811ec2611cd0a11cc8611cc2811dd861c1010ff4200fe1500ff4800e"
78+
"00000000d11000000600000007cc3ca4833b9c033b94033da0833c94433890c30100000061200000"
79+
"06000000130481860301000002000000075010cd14610000000000007120000003000000320e1022"
80+
"8400fb020000000000000000650c00001f000000120394f000000000030000000600000006000000"
81+
"4c000000010000005800000000000000580000000100000070000000000000000c00000013000000"
82+
"1f000000080000000600000000000000700000000000000000000000010000000000000000000000"
83+
"060000000000000006000000ffffffff00240000000000005d0c00000d0000001203946700000000"
84+
"6b65726e656c31352e302e376e7670747836342d6e76696469612d637564613c737472696e673e00"
85+
"00000000",
86+
(2, 3): # (major, debug_major)
87+
"4243c0de3514000005000000620c30244a59be669dfbb4bf0b51804c01000000210c000080010000"
88+
"0b02210002000000160000000781239141c80449061032399201840c250508191e048b62800c4502"
89+
"42920b42641032143808184b0a3232884870c421234412878c1041920264c808b1142043468820c9"
90+
"01323284182a282a90317cb05c9120c3c8000000892000000b0000003222c80820624600212b2498"
91+
"0c212524980c19270c85a4906032645c20246382a01801300128030173046000132677b00778a007"
92+
"7cb0033a680377b0877420877408873618877a208770d8e012e5d006f0a0077640077a600774a007"
93+
"7640076d900e71a00778a00778d006e980077a80077a80076d900e7160077a100776a0077160076d"
94+
"900e7320077a300772a0077320076d900e7640077a600774a0077640076d900e71200778a0077120"
95+
"0778a00771200778d006e6300772a0077320077a300772d006e6600774a0077640077a600774d006"
96+
"f6100776a0077160077a100776d006f6300772a0077320077a300772d006f6600774a0077640077a"
97+
"600774d006f610077280077a10077280077a10077280076de00e7160077a300772a0077640071a21"
98+
"4c0e11de9c2e4fbbcfbe211560040000000000000000000000000620b141a0286100004016080000"
99+
"06000000321e980c19114c908c092647c60443620914c10840190000b1180000ac0000003308801c"
100+
"c4e11c6614013d88433884c38c4280077978077398710ce6000fed100ef4800e330c421ec2c11dce"
101+
"a11c6630053d88433884831bcc033dc8433d8c033dcc788c7470077b08077948877070077a700376"
102+
"788770208719cc110eec900ee1300f6e300fe3f00ef0500e3310c41dde211cd8211dc2611e663089"
103+
"3bbc833bd04339b4033cbc833c84033bccf0147660077b6807376887726807378087709087706007"
104+
"76280776f8057678877780875f08877118877298877998812ceef00eeee00ef5c00eec300362c8a1"
105+
"1ce4a11ccca11ce4a11cdc611cca211cc4811dca6106d6904339c84339984339c84339b8c3389443"
106+
"3888033b94c32fbc833cfc823bd4033bb0c30cc7698770588772708374680778608774188774a087"
107+
"19ce530fee000ff2500ee4900ee3400fe1200eec500e3320281ddcc11ec2411ed2211cdc811edce0"
108+
"1ce4e11dea011e66185138b0433a9c833bcc50247660077b68073760877778077898514cf4900ff0"
109+
"500e331e6a1eca611ce8211ddec11d7e011ee4a11ccc211df0610654858338ccc33bb0433dd04339"
110+
"fcc23ce4433b88c33bb0c38cc50a877998877718877408077a28077298815ce3100eecc00ee5500e"
111+
"f33023c1d2411ee4e117d8e11dde011e6648193bb0833db4831b84c3388c4339ccc33cb8c139c8c3"
112+
"3bd4033ccc48b471080776600771088771588719dbc60eec600fede006f0200fe5300fe5200ff650"
113+
"0e6e100ee3300ee5300ff3e006e9e00ee4500ef83023e2ec611cc2811dd8e117ec211de6211dc421"
114+
"1dd8211de8211f66209d3bbc433db80339948339cc58bc7070077778077a08077a488777708719cb"
115+
"e70eef300fe1e00ee9400fe9a00fe530c3010373a8077718875f988770708774a08774d087729881"
116+
"844139e0c338b0433d904339cc40c4a01dcaa11de0411edec11c662463300ee1c00eec300fe9400f"
117+
"e5000000792000001e000000721e482043880c19097232482023818c9191d144a01028643c313242"
118+
"8e9021a318100a00060000006b65726e656c0000230802308240042308843082400c23080431c320"
119+
"04c30c045118858c04262821373bbb36973037b737ba30bab437b7b95102231d373bbbb6343917bb"
120+
"32b9b9b437b7518203000000a9180000250000000b0a7228877780077a587098433db8c338b04339"
121+
"d0c382e61cc6a10de8411ec2c11de6211de8211ddec11d1634e3600ee7500fe1200fe4400fe1200f"
122+
"e7500ef4b08081077928877060077678877108077a28077258709cc338b4013ba4833d94c3026b1c"
123+
"d8211cdce11cdc201ce4611cdc201ce8811ec2611cd0a11cc8611cc2811dd861c1010ff4200fe150"
124+
"0ff4800e00000000d11000000600000007cc3ca4833b9c033b94033da0833c94433890c301000000"
125+
"6120000006000000130481860301000002000000075010cd14610000000000007120000003000000"
126+
"320e10228400fc020000000000000000650c00001f000000120394f0000000000300000006000000"
127+
"060000004c000000010000005800000000000000580000000100000070000000000000000c000000"
128+
"130000001f0000000800000006000000000000007000000000000000000000000100000000000000"
129+
"00000000060000000000000006000000ffffffff00240000000000005d0c00000d00000012039467"
130+
"000000006b65726e656c31352e302e376e7670747836342d6e76696469612d637564613c73747269"
131+
"6e673e0000000000",
132+
}
133+
134+
MINIMAL_NVVMIR_CACHE = {}
135+
136+
137+
@pytest.fixture(params=MINIMAL_NVVMIR_FIXTURE_PARAMS)
75138
def minimal_nvvmir(request):
76-
return MINIMAL_NVVMIR_TXT if request.param == "txt" else MINIMAL_NVVMIR_BITCODE
139+
for pass_counter in range(2):
140+
nvvmir = MINIMAL_NVVMIR_CACHE.get(request.param, -1)
141+
if nvvmir != -1:
142+
if nvvmir is None:
143+
pytest.skip(f"UNAVAILABLE: {request.param}")
144+
return nvvmir
145+
if pass_counter:
146+
raise AssertionError("This code path is meant to be unreachable.")
147+
# Build cache entries, then try again (above).
148+
major, minor, debug_major, debug_minor = nvvm.ir_version()
149+
txt = MINIMAL_NVVMIR_TXT % (major, debug_major)
150+
if llvmlite_binding is None:
151+
bitcode_dynamic = None
152+
else:
153+
bitcode_dynamic = llvmlite_binding.parse_assembly(txt.decode()).as_bitcode()
154+
bitcode_static = MINIMAL_NVVMIR_BITCODE_STATIC.get((major, debug_major))
155+
if bitcode_static is not None:
156+
bitcode_static = binascii.unhexlify(bitcode_static)
157+
MINIMAL_NVVMIR_CACHE["txt"] = txt
158+
MINIMAL_NVVMIR_CACHE["bitcode_dynamic"] = bitcode_dynamic
159+
MINIMAL_NVVMIR_CACHE["bitcode_static"] = bitcode_static
160+
if bitcode_static is None:
161+
if bitcode_dynamic is None:
162+
raise RuntimeError("Please `pip install llvmlite` to generate `bitcode_static` (see PR #443)")
163+
bitcode_hex = binascii.hexlify(bitcode_dynamic).decode("ascii")
164+
print("\n\nMINIMAL_NVVMIR_BITCODE_STATIC = { # PLEASE ADD TO test_nvvm.py")
165+
print(f" ({major}, {debug_major}): # (major, debug_major)")
166+
lines = textwrap.wrap(bitcode_hex, width=80)
167+
for line in lines[:-1]:
168+
print(f' "{line}"')
169+
print(f' "{lines[-1]}",')
170+
print("}\n", flush=True)
77171

78172

79173
@pytest.fixture(params=[nvvm.compile_program, nvvm.verify_program])
@@ -103,13 +197,13 @@ def get_program_log(prog):
103197
def test_nvvm_version():
104198
ver = nvvm.version()
105199
assert len(ver) == 2
106-
assert ver >= (2, 0)
200+
assert ver >= (1, 0)
107201

108202

109203
def test_nvvm_ir_version():
110204
ver = nvvm.ir_version()
111205
assert len(ver) == 4
112-
assert ver >= (2, 0, 3, 1)
206+
assert ver >= (1, 0, 0, 0)
113207

114208

115209
def test_create_and_destroy():
@@ -167,7 +261,7 @@ def test_get_buffer_empty(get_size, get_buffer):
167261

168262

169263
@pytest.mark.parametrize("options", [[], ["-opt=0"], ["-opt=3", "-g"]])
170-
def test_compile_program_with_minimal_nnvm_ir(minimal_nvvmir, options):
264+
def test_compile_program_with_minimal_nvvm_ir(minimal_nvvmir, options):
171265
with nvvm_program() as prog:
172266
nvvm.add_module_to_program(prog, minimal_nvvmir, len(minimal_nvvmir), "FileNameHere.ll")
173267
try:
@@ -187,7 +281,7 @@ def test_compile_program_with_minimal_nnvm_ir(minimal_nvvmir, options):
187281

188282

189283
@pytest.mark.parametrize("options", [[], ["-opt=0"], ["-opt=3", "-g"]])
190-
def test_verify_program_with_minimal_nnvm_ir(minimal_nvvmir, options):
284+
def test_verify_program_with_minimal_nvvm_ir(minimal_nvvmir, options):
191285
with nvvm_program() as prog:
192286
nvvm.add_module_to_program(prog, minimal_nvvmir, len(minimal_nvvmir), "FileNameHere.ll")
193287
nvvm.verify_program(prog, len(options), options)

0 commit comments

Comments
 (0)