Fix view scalar bug segfault (#1603)

* fix view scalar bug

* fix view scalar bug

* one more fix
This commit is contained in:
Awni Hannun 2024-11-19 10:54:05 -08:00 committed by GitHub
parent 5e89aace9b
commit 61d787726a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 7 additions and 3 deletions

View File

@ -606,7 +606,7 @@ void View::eval_cpu(const std::vector<array>& inputs, array& out) {
if (ibytes == obytes || obytes < ibytes && in.strides().back() == 1 || if (ibytes == obytes || obytes < ibytes && in.strides().back() == 1 ||
in.flags().row_contiguous) { in.flags().row_contiguous) {
auto strides = in.strides(); auto strides = in.strides();
for (int i = 0; i < strides.size() - 1; ++i) { for (int i = 0; i < static_cast<int>(strides.size()) - 1; ++i) {
strides[i] *= ibytes; strides[i] *= ibytes;
strides[i] /= obytes; strides[i] /= obytes;
} }

View File

@ -417,7 +417,7 @@ void View::eval_gpu(const std::vector<array>& inputs, array& out) {
if (ibytes == obytes || obytes < ibytes && in.strides().back() == 1 || if (ibytes == obytes || obytes < ibytes && in.strides().back() == 1 ||
in.flags().row_contiguous) { in.flags().row_contiguous) {
auto strides = in.strides(); auto strides = in.strides();
for (int i = 0; i < strides.size() - 1; ++i) { for (int i = 0; i < static_cast<int>(strides.size()) - 1; ++i) {
strides[i] *= ibytes; strides[i] *= ibytes;
strides[i] /= obytes; strides[i] /= obytes;
} }

View File

@ -4587,7 +4587,7 @@ array view(const array& a, const Dtype& dtype, StreamOrDevice s /* = {} */) {
" axis must be a multiple of the requested type size."); " axis must be a multiple of the requested type size.");
} }
out_shape.back() /= (obytes / ibytes); out_shape.back() /= (obytes / ibytes);
} else { } else if (ibytes > obytes) {
// Type size ratios are always integers // Type size ratios are always integers
out_shape.back() *= (ibytes / obytes); out_shape.back() *= (ibytes / obytes);
} }

View File

@ -2532,6 +2532,10 @@ class TestOps(mlx_tests.MLXTestCase):
self.assertTrue(np.array_equal(np.array(out_mlx), out_np)) self.assertTrue(np.array_equal(np.array(out_mlx), out_np))
def test_view(self): def test_view(self):
# Check scalar
out = mx.array(1, mx.int8).view(mx.uint8).item()
self.assertEqual(out, 1)
a = mx.random.randint(shape=(4, 2, 4), low=-100, high=100) a = mx.random.randint(shape=(4, 2, 4), low=-100, high=100)
a_np = np.array(a) a_np = np.array(a)