inducer / inducer/loopy

[Enhancement]: Parallelizing a very long kernel is slow

Open
#288 7 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
636
Forks
81
Avg merge
1d 19h
Merged PRs (30d)
7

Description

```python3
import loopy as lp
import vmprof

def make_kernel():
n_insn = 2000
# 'ndomains' must be greater than 'n' as it also includes the iname domains
# of sub-arrays refs.
n_domains = 6000
k1 = 100
k2 = 10

insns_as_str = [f"y{i}[idim{i},jdim{i}] = x{i}[idim{i},jdim{i}]"
for i in range(n_insn)]
domains = [f"{{[idim{i},jdim{i}]: 0<=idim{i}<{k1} and 0<=jdim{i}<{k2}}}"
for i in range(n_domains)]

x_args = [lp.GlobalArg(f"x{i}, y{i}", shape=(k1, k2), dtype=float)
for i in range(n_insn)]

return lp.make_kernel(domains,
"\n".join(insns_as_str),
x_args,
lang_version=(2018, 2))

def parallelize(knl):
nwg = 48
nwi = (16, 2)

# parallelize each instruction
for i in range(len(knl.instructions)):
bigger_loop = f"idim{i}"
smaller_loop = f"jdim{i}"
knl = lp.chunk_iname(knl, bigger_loop, nwg,
outer_tag="g.0",
within=f"iname:{bigger_loop}")
knl = lp.split_iname(knl, f"{bigger_loop}_inner",
nwi[0], inner_tag="l.1",
within=f"iname:{bigger_loop}_inner")
knl = lp.split_iname(knl, smaller_loop,
nwi[1], inner_tag="l.0",
within=f"iname:{smaller_loop}")

if i == 25:
print("I quit after parallelizing 25 instructions.")
break
print(f"Done transforming insn i={i}....")

if __name__ == "__main__":
knl = make_kernel()

with open("test.prof", "w+b") as f:
vmprof.enable(f.fileno())
parallelize(knl)
vmprof.disable()

```

/cc @inducer @isuruf

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.