Skip to content

Instantly share code, notes, and snippets.

@srikumarks
Last active December 21, 2015 03:09
Show Gist options
  • Save srikumarks/6240337 to your computer and use it in GitHub Desktop.
Save srikumarks/6240337 to your computer and use it in GitHub Desktop.
BLAS-based matrix multiplication in node.js (for Julia micro benchmark)
// Requirements:
// 1) npm install ffi
// 2) npm install ref
// 3) dynamically loadable libblas must be available aleady.
var ffi = require('ffi');
var ref = require('ref');
var doublePtr = ref.refType(ref.types.double);
var blas = new ffi.Library('libblas', {
'cblas_dgemm': ['void', [
'int', 'int', 'int', 'int', 'int', 'int',
'double', doublePtr, 'int', doublePtr,
'int', 'double', doublePtr, 'int'
]]
});
var CblasRowMajor = 101;
var CblasNoTrans = 111;
var sizeofDouble = 8;
function blas_randmat(m, n) {
var M = new Buffer(m * n * sizeofDouble);
var i, j, offset = 0;
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j) {
M.writeDoubleLE(Math.random(), offset);
offset += sizeofDouble;
}
}
return M;
}
function blas_matmul(A, B, m, l, n) {
var C = new Buffer(m * n * sizeofDouble);
blas.cblas_dgemm(
CblasRowMajor,
CblasNoTrans,
CblasNoTrans,
m, n, l,
1.0, A,
l, B, n,
0.0,
C, n);
return C;
}
function blas_randmatmul(n) {
var A = blas_randmat(n, n);
var B = blas_randmat(n, n);
return blas_matmul(A, B, n, n, n);
}
// How to sanity-test the result -
// C = blas_randmatmul(1000);
// assert(0 < C.readDoubleLE(0));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment