47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
"""Regression for divergent finite loops in the public CPU PTX reference."""
|
|
import pathlib
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
|
|
import numpy as np
|
|
|
|
ROOT = pathlib.Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(ROOT / 'kernels/tools'))
|
|
import ptxsim
|
|
|
|
|
|
class ControlFlow(unittest.TestCase):
|
|
def test_divergent_backward_loop_reconverges(self):
|
|
source = '''.visible .entry pattern(.param .align 8 .b8 pattern_param_0[8])
|
|
.maxntid 32, 1, 1
|
|
{
|
|
.reg .b32 %r<4>;
|
|
.reg .pred %p<1>;
|
|
mov.u32 %r0, %tid.x;
|
|
and.b32 %r0, %r0, 3;
|
|
add.u32 %r0, %r0, 1;
|
|
mov.u32 %r1, 0;
|
|
$loop:
|
|
add.u32 %r1, %r1, %r0;
|
|
sub.u32 %r0, %r0, 1;
|
|
setp.ne.u32 %p0, %r0, 0;
|
|
@%p0 bra $loop;
|
|
add.u32 %r2, %r1, 7;
|
|
ret;
|
|
}
|
|
'''
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
path = pathlib.Path(directory) / 'pattern.ptx'
|
|
path.write_text(source)
|
|
statements, types, shared = ptxsim.parse_kernel(str(path), 'pattern')
|
|
block = ptxsim.Block(statements, types, shared, None, 'pattern_param_0', (32, 1, 1), (1, 1, 1), (0, 0, 0))
|
|
block.run(limit=1000)
|
|
n = np.arange(32) % 4 + 1
|
|
np.testing.assert_array_equal(block.regs['%r1'], n * (n + 1) // 2)
|
|
np.testing.assert_array_equal(block.regs['%r2'], n * (n + 1) // 2 + 7)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|