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 ||
in.flags().row_contiguous) {
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] /= 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 ||
in.flags().row_contiguous) {
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] /= 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.");
}
out_shape.back() /= (obytes / ibytes);
} else {
} else if (ibytes > obytes) {
// Type size ratios are always integers
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))
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_np = np.array(a)