| 566 | return UOp(Ops.REDUCE, kwargs.pop('dtype', self.dtype), src=(self,)+src, arg=arg, **kwargs) |
| 567 | |
| 568 | def contiguous(self, *args, **kwargs): |
| 569 | if self.op is Ops.CONTIGUOUS: return self |
| 570 | if self.device is None: return self |
| 571 | if self.has_buffer_identity(): return self |
| 572 | return UOp(Ops.CONTIGUOUS, dtype=self.dtype, src=(self,)+args, **kwargs) |
| 573 | def bufferize(self, *args, **kwargs): return UOp(Ops.STAGE, dtype=self.dtype, src=(self,)+args, **kwargs) |
| 574 | def allreduce(self, op, device:str|tuple[str, ...]|UOp): |
| 575 | assert isinstance(self.device, tuple), f"allreduce must be on tuple {self.device} isn't" |