The memory allocated by memref on spike
simulator is all zeros.I want to do some arithmetic and run some tests. Is there a way to initialize memref? Because I’m allocating a lot of memory.If anyone could help me, I would be grateful.Thanks!
Hi, mlir::linalg::FillRng2DOp from the linalg dialect should help you with that. For constant values use the mlir::linalg::FillOp.
Alternatively, you could initialize it manually.
%alloc = memref.alloc() : memref<4x4xf64>
%cst = arith.constant 0.000000e+00 : f64 // or some other value
affine.for %arg0 = 0 to 4 {
affine.for %arg1 = 0 to 4 {
affine.store %cst, %alloc[%arg0, %arg1] : memref<4x4xf64>
}
}
2 Likes
Bear in mind that FillRng2DOp
lowers code in the IR to do the RNG.
@philipportner’s manual initialization is more or less what FillOp
would do.
Another option is to use dense
globals:
memref.global "private" constant @__constant : memref<2x2x3x8xf32> = dense<1.000000e+00> {alignment = 128 : i64}
...
%1 = memref.get_global @__constant : memref<2x2x3x8xf32>
At tensor level, you can just declare an arith.constant
(which will become a global+get after bufferization):
%cst = arith.constant dense<4.900000e+01> : tensor<2x2x3x8xf32>
The dense attribute doesn’t need to be a splat (all of the same value), but if not, you have to add every single value there, which can be messy. There’s also a hex representation that compacts things a bit if you have large tensors.
2 Likes