示例#1
0
    def test_sparse_vector(self):
        mat3 = dot_product_mkl(self.mat1, self.mat2_d[:, 0])
        mat3_np = np.dot(self.mat1_d, self.mat2_d[:, 0])

        npt.assert_array_almost_equal(mat3_np, mat3)
示例#2
0
    def test_dense_dense(self):
        mat3 = dot_product_mkl(self.mat1_zero, self.mat2_d)
        mat3_np = np.dot(self.mat1_zero, self.mat2_d)

        npt.assert_array_almost_equal(mat3_np, mat3)
示例#3
0
    def test_2d_2d(self):
        mat3 = dot_product_mkl(VECTOR.reshape(1, -1), VECTOR.reshape(-1, 1))
        mat3_np = np.dot(VECTOR.reshape(1, -1), VECTOR.reshape(-1, 1))

        npt.assert_array_almost_equal(mat3_np, mat3)
示例#4
0
    def test_sparse_sparse(self):

        mat3 = dot_product_mkl(self.mat1, self.mat2)
        mat3_np = np.dot(self.mat1_d, self.mat2_d)

        npt.assert_array_almost_equal(mat3_np, mat3.A)
示例#5
0
    def test_mixed_nocast(self):
        d1, d2 = self.mat1, self.mat2.astype(np.float32)

        with self.assertRaises(ValueError):
            hsp3 = dot_product_mkl(d1, d2, cast=False)
示例#6
0
    def test_1d_1d(self):
        mat3 = dot_product_mkl(VECTOR, VECTOR)
        mat3_np = np.dot(VECTOR, VECTOR)

        npt.assert_array_almost_equal(mat3_np, mat3)
示例#7
0
    def test_COO(self):
        d1, d2 = _spsparse.coo_matrix(self.mat1), self.mat2

        with self.assertRaises(ValueError):
            hsp3 = dot_product_mkl(d1, d2)
示例#8
0
    def test_highly_highly_sparse_CSR(self):
        hsp1, hsp2 = make_matrixes(2000, 1000, 3000, 0.000005)
        hsp3_sp = hsp1.dot(hsp2)
        hsp3 = dot_product_mkl(hsp1, hsp2)

        npt.assert_array_almost_equal(hsp3.A, hsp3_sp.A)
示例#9
0
 def test_csr_error_bad_dims(self):
     with self.assertRaises(ValueError):
         mat3 = dot_product_mkl(self.mat1.transpose(), self.mat2)
    def test_mult_2d_both_float32(self):
        mat3 = dot_product_mkl(self.make_2d(self.mat1.astype(np.float32)),
                               self.make_2d(self.mat2.astype(np.float32)))
        mat3_np = np.dot(self.make_2d(self.mat1_d), self.make_2d(self.mat2_d))

        npt.assert_array_almost_equal(mat3_np, mat3, decimal=5)
示例#11
0
def do_spmm_exp(args):
    # load data
    Y = smat_util.load_matrix(args.y_npz_path).astype(np.float32)
    X = smat_util.load_matrix(args.x_npz_path).astype(np.float32)
    YT_csr = Y.T.tocsr()
    X_csr = X.tocsr()

    # The #threads is control by env variables (except for pecos)
    # e.g., export OMP_NUM_THREADS=16, export MKL_NUM_THREADS=16.
    run_time = 0.0
    if args.spmm_algo == "pecos":
        start = time.time()
        Z = pecos_clib.sparse_matmul(
            YT_csr,
            X_csr,
            eliminate_zeros=False,
            sorted_indices=True,
            threads=args.threads,
        )
        run_time += time.time() - start
        Z_data = Z.data
    elif args.spmm_algo == "intel-mkl":
        from sparse_dot_mkl import dot_product_mkl
        # make sure set the index to int64 for large matrices
        # export MKL_INTERFACE_LAYER=ILP64
        start = time.time()
        Z = dot_product_mkl(YT_csr, X_csr, reorder_output=True)
        run_time += time.time() - start
        Z_data = Z.data
    elif args.spmm_algo == "scipy":
        # scipy will not sorted the indices for each row,
        # so we do it explicitly
        start = time.time()
        Z = YT_csr.dot(X_csr)
        Z.sort_indices()
        run_time += time.time() - start
        Z_data = Z.data
    elif args.spmm_algo == "pytorch":
        import torch

        def get_pt_data(A_csr):
            A_indices, A_values = csr_to_coo(A_csr)
            A_pt = torch.sparse_coo_tensor(
                A_indices.T.astype(np.int64),
                A_values.astype(np.float32),
                A_csr.shape,
            )
            return A_pt

        YT_pt = get_pt_data(YT_csr)
        X_pt = get_pt_data(X_csr)
        start = time.time()
        Z_pt = torch.sparse.mm(YT_pt, X_pt)
        run_time += time.time() - start
        Z_data = Z_pt.coalesce().values().numpy()
    elif args.spmm_algo == "tensorflow":
        import tensorflow.compat.v1 as tf
        from tensorflow.python.ops.linalg.sparse import sparse_csr_matrix_ops

        def get_tf_data(A_csr):
            # Define (COO format) Sparse Tensors over Numpy arrays
            A_indices, A_values = csr_to_coo(A_csr)
            A_st = tf.sparse.SparseTensor(
                A_indices.astype(np.int64),
                A_values.astype(np.float32),
                A_csr.shape,
            )
            return A_st

        # Tensorflow (v2.5.0) usage, as of 07/20/2021:
        # https://www.tensorflow.org/api_docs/python/tf/raw_ops/SparseMatrixSparseMatMul
        with tf.Session() as sess:
            YT_st = get_tf_data(YT_csr)
            X_st = get_tf_data(X_csr)
            sess.run(YT_st)
            sess.run(X_st)
            YT_sm = sparse_csr_matrix_ops.sparse_tensor_to_csr_sparse_matrix(
                YT_st.indices, YT_st.values, YT_st.dense_shape)
            X_sm = sparse_csr_matrix_ops.sparse_tensor_to_csr_sparse_matrix(
                X_st.indices, X_st.values, X_st.dense_shape)
            start = time.time()
            Z_sm = sparse_csr_matrix_ops.sparse_matrix_sparse_mat_mul(
                a=YT_sm, b=X_sm, type=tf.float32)
            Z_st = sparse_csr_matrix_ops.csr_sparse_matrix_to_sparse_tensor(
                Z_sm, tf.float32)
            Z_data = sess.run(Z_st.values)
            run_time += time.time() - start
    else:
        raise ValueError(f"spmm_algo={args.spmm_algo} is not valid")
    run_time = time.time() - start
    print(
        "algo {:16s} time(s) {:9.5f} nnz(Z) {:12d} mu(Z.data) {:8.4f}".format(
            args.spmm_algo,
            run_time,
            len(Z_data),
            np.mean(Z_data),
        ))