/// Returns the next element for the sparse tensor being read.
#define IMPL_GETNEXT(VNAME, V) \
- MLIR_CRUNNERUTILS_EXPORT V _mlir_ciface_getSparseTensorReaderNext##VNAME( \
- void *p, StridedMemRefType<index_type, 1> *iref);
+ MLIR_CRUNNERUTILS_EXPORT void _mlir_ciface_getSparseTensorReaderNext##VNAME( \
+ void *p, StridedMemRefType<index_type, 1> *iref, \
+ StridedMemRefType<V, 0> *vref);
MLIR_SPARSETENSOR_FOREVERY_V(IMPL_GETNEXT)
#undef IMPL_GETNEXT
#define IMPL_OUTNEXT(VNAME, V) \
MLIR_CRUNNERUTILS_EXPORT void _mlir_ciface_outSparseTensorWriterNext##VNAME( \
void *p, index_type rank, StridedMemRefType<index_type, 1> *iref, \
- V value);
+ StridedMemRefType<V, 0> *vref);
MLIR_SPARSETENSOR_FOREVERY_V(IMPL_OUTNEXT)
#undef IMPL_OUTNEXT
}
#define IMPL_GETNEXT(VNAME, V) \
- V _mlir_ciface_getSparseTensorReaderNext##VNAME( \
- void *p, StridedMemRefType<index_type, 1> *iref) { \
- assert(p &&iref); \
+ void _mlir_ciface_getSparseTensorReaderNext##VNAME( \
+ void *p, StridedMemRefType<index_type, 1> *iref, \
+ StridedMemRefType<V, 0> *vref) { \
+ assert(p &&iref &&vref); \
assert(iref->strides[0] == 1); \
index_type *indices = iref->data + iref->offset; \
SparseTensorReader *stfile = static_cast<SparseTensorReader *>(p); \
uint64_t idx = strtoul(linePtr, &linePtr, 10); \
indices[r] = idx - 1; \
} \
- return detail::readCOOValue<V>(&linePtr, stfile->isPattern()); \
+ V *value = vref->data + vref->offset; \
+ *value = detail::readCOOValue<V>(&linePtr, stfile->isPattern()); \
}
MLIR_SPARSETENSOR_FOREVERY_V(IMPL_GETNEXT)
#undef IMPL_GETNEXT
#define IMPL_OUTNEXT(VNAME, V) \
void _mlir_ciface_outSparseTensorWriterNext##VNAME( \
void *p, index_type rank, StridedMemRefType<index_type, 1> *iref, \
- V value) { \
- assert(p &&iref); \
+ StridedMemRefType<V, 0> *vref) { \
+ assert(p &&iref &&vref); \
assert(iref->strides[0] == 1); \
index_type *indices = iref->data + iref->offset; \
SparseTensorWriter &file = *static_cast<SparseTensorWriter *>(p); \
for (uint64_t r = 0; r < rank; ++r) \
file << (indices[r] + 1) << " "; \
- file << value << std::endl; \
+ V *value = vref->data + vref->offset; \
+ file << *value << std::endl; \
}
MLIR_SPARSETENSOR_FOREVERY_V(IMPL_OUTNEXT)
#undef IMPL_OUTNEXT
func.func private @getSparseTensorReaderRank(!TensorReader) -> (index)
func.func private @getSparseTensorReaderNNZ(!TensorReader) -> (index)
func.func private @getSparseTensorReaderIsSymmetric(!TensorReader) -> (i1)
- func.func private @getSparseTensorReaderDimSizes(!TensorReader, memref<?xindex>)
- -> () attributes { llvm.emit_c_interface }
- func.func private @getSparseTensorReaderNextF32(!TensorReader, memref<?xindex>)
- -> (f32) attributes { llvm.emit_c_interface }
+ func.func private @getSparseTensorReaderDimSizes(!TensorReader,
+ memref<?xindex>) -> () attributes { llvm.emit_c_interface }
+ func.func private @getSparseTensorReaderNextF32(!TensorReader,
+ memref<?xindex>, memref<f32>) -> () attributes { llvm.emit_c_interface }
func.func private @createSparseTensorWriter(!Filename) -> (!TensorWriter)
func.func private @delSparseTensorWriter(!TensorWriter)
func.func private @outSparseTensorWriterMetaData(!TensorWriter, index, index,
memref<?xindex>) -> () attributes { llvm.emit_c_interface }
func.func private @outSparseTensorWriterNextF32(!TensorWriter, index,
- memref<?xindex>, f32) -> () attributes { llvm.emit_c_interface }
+ memref<?xindex>, memref<f32>) -> () attributes { llvm.emit_c_interface }
func.func @dumpi(%arg0: memref<?xindex>) {
%c0 = arith.constant 0 : index
%x1s = memref.alloc(%nnz) : memref<?xindex>
%vs = memref.alloc(%nnz) : memref<?xf32>
%indices = memref.alloc(%rank) : memref<?xindex>
+ %value = memref.alloca() : memref<f32>
scf.for %i = %c0 to %nnz step %c1 {
- %v = func.call @getSparseTensorReaderNextF32(%tensor, %indices)
- : (!TensorReader, memref<?xindex>) -> f32
+ func.call @getSparseTensorReaderNextF32(%tensor, %indices, %value)
+ : (!TensorReader, memref<?xindex>, memref<f32>) -> ()
+ // TODO: can we use memref.subview to avoid the need for the %value
+ // buffer?
+ %v = memref.load %value[] : memref<f32>
memref.store %v, %vs[%i] : memref<?xf32>
%i0 = memref.load %indices[%c0] : memref<?xindex>
memref.store %i0, %x0s[%i] : memref<?xindex>
//TODO: handle isSymmetric.
// Assume rank == 2.
%indices = memref.alloc(%rank) : memref<?xindex>
+ %value = memref.alloca() : memref<f32>
scf.for %i = %c0 to %nnz step %c1 {
- %v = func.call @getSparseTensorReaderNextF32(%tensor0, %indices)
- : (!TensorReader, memref<?xindex>) -> f32
- func.call @outSparseTensorWriterNextF32(%tensor1, %rank, %indices, %v)
- : (!TensorWriter, index, memref<?xindex>, f32) -> ()
+ func.call @getSparseTensorReaderNextF32(%tensor0, %indices, %value)
+ : (!TensorReader, memref<?xindex>, memref<f32>) -> ()
+ func.call @outSparseTensorWriterNextF32(%tensor1, %rank, %indices, %value)
+ : (!TensorWriter, index, memref<?xindex>, memref<f32>) -> ()
}
// Release the resources.