You could also use broadcasting, which will save some memory:
x * y.view(-1, 1)
> tensor([[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.],
        [ 2.,  4.,  6.,  8., 10., 12., 14., 16.],
        [ 3.,  6.,  9., 12., 15., 18., 21., 24.]])