MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / mtm

Function mtm

src/backend/opencl/cpu/cpu_sparse_blas.cpp:389–422  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

387
388template<typename T, bool conjugate>
389void mtm(Array<T> output, const Array<T> values, const Array<int> rowIdx,
390 const Array<int> colIdx, const Array<T> right, int M, int N, int ldb,
391 int ldc) {
392 mapped_ptr<T> oPtr = output.getMappedPtr();
393 mapped_ptr<T> rhtPtr = right.getMappedPtr();
394 mapped_ptr<T> vPtr = values.getMappedPtr();
395 mapped_ptr<int> rPtr = rowIdx.getMappedPtr();
396 mapped_ptr<int> cPtr = colIdx.getMappedPtr();
397
398 T const *const valPtr = vPtr.get();
399 int const *const rowPtr = rPtr.get();
400 int const *const colPtr = cPtr.get();
401 T const *rhsPtr = rhtPtr.get();
402 T *outPtr = oPtr.get();
403
404 for (int o = 0; o < N; ++o) {
405 for (int i = 0; i < M; ++i) { outPtr[i] = scalar<T>(0); }
406
407 for (int i = 0; i < rowIdx.dims()[0] - 1; ++i) {
408 for (int j = rowPtr[i]; j < rowPtr[i + 1]; ++j) {
409 // If stride[0] of right is not 1 then rhsPtr[i*stride]
410 if (conjugate) {
411 outPtr[colPtr[j]] =
412 outPtr[colPtr[j]] + getConjugate(valPtr[j]) * rhsPtr[i];
413 } else {
414 outPtr[colPtr[j]] =
415 outPtr[colPtr[j]] + valPtr[j] * rhsPtr[i];
416 }
417 }
418 }
419 rhsPtr += ldb;
420 outPtr += ldc;
421 }
422}
423template<typename T>
424Array<T> matmul(const common::SparseArray<T> lhs, const Array<T> rhs,
425 af_mat_prop optLhs, af_mat_prop optRhs) {

Callers

nothing calls this directly

Calls 4

getConjugateFunction · 0.70
getMappedPtrMethod · 0.45
getMethod · 0.45
dimsMethod · 0.45

Tested by

no test coverage detected