Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions python/infinicore/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
from infinicore.ops.broadcast_to import broadcast_to
from infinicore.ops.cat import cat
from infinicore.ops.cdist import cdist
from infinicore.ops.copysign import copysign
from infinicore.ops.cross_entropy import cross_entropy
from infinicore.ops.diff import diff
from infinicore.ops.digamma import digamma
Expand All @@ -94,8 +95,10 @@
from infinicore.ops.kron import kron
from infinicore.ops.kthvalue import kthvalue
from infinicore.ops.kv_caching import kv_caching
from infinicore.ops.lcm import lcm
from infinicore.ops.ldexp import ldexp
from infinicore.ops.lerp import lerp
from infinicore.ops.lgamma import lgamma
from infinicore.ops.logaddexp import logaddexp
from infinicore.ops.logaddexp2 import logaddexp2
from infinicore.ops.logcumsumexp import logcumsumexp
Expand All @@ -108,10 +111,12 @@
from infinicore.ops.mha_varlen import mha_varlen
from infinicore.ops.mul import mul
from infinicore.ops.narrow import narrow
from infinicore.ops.nextafter import nextafter
from infinicore.ops.nrm2 import nrm2
from infinicore.ops.paged_attention import paged_attention
from infinicore.ops.paged_attention_prefill import paged_attention_prefill
from infinicore.ops.paged_caching import paged_caching
from infinicore.ops.rad2deg import rad2deg
from infinicore.ops.rearrange import rearrange
from infinicore.ops.reciprocal import reciprocal
from infinicore.ops.rot import rot
Expand Down Expand Up @@ -279,6 +284,11 @@
"var",
"topk",
"all",
"copysign",
"lcm",
"lgamma",
"nextafter",
"rad2deg",
"set_printoptions",
"printoptions",
]
Expand Down
8 changes: 8 additions & 0 deletions python/infinicore/ops/copysign.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import infinicore
from infinicore.tensor import Tensor


def copysign(input: Tensor, other: Tensor, *, out=None) -> Tensor:
r"""Computes element-wise copysign: magnitude of input with sign of other."""
assert infinicore.use_ntops
return infinicore.ntops.torch.copysign(input, other, out=out)
8 changes: 8 additions & 0 deletions python/infinicore/ops/lcm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import infinicore
from infinicore.tensor import Tensor


def lcm(input: Tensor, other: Tensor, *, out=None) -> Tensor:
r"""Computes element-wise least common multiple. Integer dtypes only."""
assert infinicore.use_ntops
return infinicore.ntops.torch.lcm(input, other, out=out)
8 changes: 8 additions & 0 deletions python/infinicore/ops/lgamma.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import infinicore
from infinicore.tensor import Tensor


def lgamma(input: Tensor, *, out=None) -> Tensor:
r"""Computes element-wise natural logarithm of the absolute value of the gamma function."""
assert infinicore.use_ntops
return infinicore.ntops.torch.lgamma(input, out=out)
8 changes: 8 additions & 0 deletions python/infinicore/ops/nextafter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import infinicore
from infinicore.tensor import Tensor


def nextafter(input: Tensor, other: Tensor, *, out=None) -> Tensor:
r"""Returns the next representable float value of input toward other, element-wise."""
assert infinicore.use_ntops
return infinicore.ntops.torch.nextafter(input, other, out=out)
8 changes: 8 additions & 0 deletions python/infinicore/ops/rad2deg.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import infinicore
from infinicore.tensor import Tensor


def rad2deg(input: Tensor, *, out=None) -> Tensor:
r"""Converts angles in radians to degrees, element-wise."""
assert infinicore.use_ntops
return infinicore.ntops.torch.rad2deg(input, out=out)
11 changes: 8 additions & 3 deletions test/infinicore/framework/benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,15 @@ def _clear_cache():
if infinicore.use_ntops:
import triton

cache = triton.runtime.driver.active.get_empty_cache_for_benchmark()
driver = triton.runtime.driver.active
get_cache = getattr(driver, "get_empty_cache_for_benchmark", None)
clear_cache = getattr(driver, "clear_cache", None)

def _clear_cache():
triton.runtime.driver.active.clear_cache(cache)
if callable(get_cache) and callable(clear_cache):
cache = get_cache()

def _clear_cache():
clear_cache(cache)

# Create pairs of DeviceEvents for each iteration
start_events = [
Expand Down
96 changes: 96 additions & 0 deletions test/infinicore/ops/copysign.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

import infinicore
import torch
from framework import (
BaseOperatorTest,
GenericTestRunner,
TensorSpec,
TestCase,
is_broadcast,
)


_TEST_CASES_DATA = [
((13, 4), None, None, None),
((13, 4), (10, 1), (10, 1), None),
((13, 4, 4), None, None, None),
((13, 4, 4), (20, 4, 1), (20, 4, 1), None),
((16, 5632), None, None, None),
]

_TOLERANCE_MAP = {
infinicore.float16: {"atol": 0, "rtol": 0},
infinicore.float32: {"atol": 0, "rtol": 0},
infinicore.bfloat16: {"atol": 0, "rtol": 0},
}

_TENSOR_DTYPES = [infinicore.float16, infinicore.bfloat16, infinicore.float32]


def parse_test_cases():
test_cases = []
for data in _TEST_CASES_DATA:
shape = data[0]
a_strides = data[1] if len(data) > 1 else None
b_strides = data[2] if len(data) > 2 else None
c_strides = data[3] if len(data) > 3 else None

c_supports_inplace = not is_broadcast(c_strides)

for dtype in _TENSOR_DTYPES:
tol = _TOLERANCE_MAP.get(dtype, {"atol": 1e-5, "rtol": 1e-4})
a_spec = TensorSpec.from_tensor(shape, a_strides, dtype, name="a")
b_spec = TensorSpec.from_tensor(shape, b_strides, dtype, name="b")
c_spec = TensorSpec.from_tensor(shape, c_strides, dtype, name="c")

test_cases.append(
TestCase(
inputs=[a_spec, b_spec],
kwargs={},
output_spec=None,
comparison_target=None,
tolerance=tol,
description="copysign - OUT_OF_PLACE",
)
)

if c_supports_inplace:
test_cases.append(
TestCase(
inputs=[a_spec, b_spec],
kwargs=None,
output_spec=c_spec,
comparison_target="out",
tolerance=tol,
description="copysign - INPLACE(out)",
)
)

return test_cases


class OpTest(BaseOperatorTest):
def __init__(self):
super().__init__("Copysign")

def get_test_cases(self):
return parse_test_cases()

def torch_operator(self, *args, **kwargs):
return torch.copysign(*args, **kwargs)

def infinicore_operator(self, *args, **kwargs):
return infinicore.copysign(*args, **kwargs)


def main():
runner = GenericTestRunner(OpTest)
runner.run_and_exit()


if __name__ == "__main__":
main()
102 changes: 102 additions & 0 deletions test/infinicore/ops/lcm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

import infinicore
import torch
from framework import (
BaseOperatorTest,
GenericTestRunner,
TensorSpec,
TestCase,
is_broadcast,
)


_TEST_CASES_DATA = [
((13, 4), None, None, None),
((13, 4), (10, 1), (10, 1), None),
((13, 4, 4), None, None, None),
((13, 4, 4), (20, 4, 1), (20, 4, 1), None),
((16, 5632), None, None, None),
]

_TOLERANCE_MAP = {
infinicore.int8: {"atol": 0, "rtol": 0},
infinicore.int16: {"atol": 0, "rtol": 0},
infinicore.int32: {"atol": 0, "rtol": 0},
infinicore.int64: {"atol": 0, "rtol": 0},
}

_TENSOR_DTYPES = [
infinicore.int8,
infinicore.int16,
infinicore.int32,
infinicore.int64,
]


def parse_test_cases():
test_cases = []
for data in _TEST_CASES_DATA:
shape = data[0]
a_strides = data[1] if len(data) > 1 else None
b_strides = data[2] if len(data) > 2 else None
c_strides = data[3] if len(data) > 3 else None

c_supports_inplace = not is_broadcast(c_strides)

for dtype in _TENSOR_DTYPES:
tol = _TOLERANCE_MAP.get(dtype, {"atol": 0, "rtol": 0})
a_spec = TensorSpec.from_tensor(shape, a_strides, dtype, name="a")
b_spec = TensorSpec.from_tensor(shape, b_strides, dtype, name="b")
c_spec = TensorSpec.from_tensor(shape, c_strides, dtype, name="c")

test_cases.append(
TestCase(
inputs=[a_spec, b_spec],
kwargs={},
output_spec=None,
comparison_target=None,
tolerance=tol,
description="lcm - OUT_OF_PLACE",
)
)

if c_supports_inplace:
test_cases.append(
TestCase(
inputs=[a_spec, b_spec],
kwargs=None,
output_spec=c_spec,
comparison_target="out",
tolerance=tol,
description="lcm - INPLACE(out)",
)
)

return test_cases


class OpTest(BaseOperatorTest):
def __init__(self):
super().__init__("Lcm")

def get_test_cases(self):
return parse_test_cases()

def torch_operator(self, *args, **kwargs):
return torch.lcm(*args, **kwargs)

def infinicore_operator(self, *args, **kwargs):
return infinicore.lcm(*args, **kwargs)


def main():
runner = GenericTestRunner(OpTest)
runner.run_and_exit()


if __name__ == "__main__":
main()
91 changes: 91 additions & 0 deletions test/infinicore/ops/lgamma.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

import infinicore
import torch
from framework import (
BaseOperatorTest,
GenericTestRunner,
TensorSpec,
TestCase,
is_broadcast,
)


_TEST_CASES_DATA = [
((13, 4), None),
((13, 4), (10, 1)),
((8, 16), None),
((8, 16), (40, 1)),
((2, 3, 4), None),
((16, 5632), None),
]

_TOLERANCE_MAP = {
infinicore.float16: {"atol": 1e-2, "rtol": 1e-2},
infinicore.float32: {"atol": 1e-5, "rtol": 1e-4},
infinicore.bfloat16: {"atol": 1e-2, "rtol": 5e-2},
}

_TENSOR_DTYPES = [infinicore.float16, infinicore.bfloat16, infinicore.float32]


def parse_test_cases():
test_cases = []
for data in _TEST_CASES_DATA:
shape = data[0]
in_strides = data[1] if len(data) > 1 else None

for dtype in _TENSOR_DTYPES:
tol = _TOLERANCE_MAP.get(dtype, {"atol": 1e-5, "rtol": 1e-4})
input_spec = TensorSpec.from_tensor(shape, in_strides, dtype)
out_spec = TensorSpec.from_tensor(shape, None, dtype)

test_cases.append(
TestCase(
inputs=[input_spec],
kwargs={},
output_spec=None,
comparison_target=None,
tolerance=tol,
description="lgamma - OUT_OF_PLACE",
)
)

test_cases.append(
TestCase(
inputs=[input_spec],
kwargs=None,
output_spec=out_spec,
comparison_target="out",
tolerance=tol,
description="lgamma - INPLACE(out)",
)
)

return test_cases


class OpTest(BaseOperatorTest):
def __init__(self):
super().__init__("Lgamma")

def get_test_cases(self):
return parse_test_cases()

def torch_operator(self, *args, **kwargs):
return torch.lgamma(*args, **kwargs)

def infinicore_operator(self, *args, **kwargs):
return infinicore.lgamma(*args, **kwargs)


def main():
runner = GenericTestRunner(OpTest)
runner.run_and_exit()


if __name__ == "__main__":
main()
Loading