1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
//------------------------------------------------------------------------------
// GB_enumify_reduce: enumerate a GrB_reduce problem
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
#include "GB.h"
#include "jitifyer/GB_stringify.h"
// Returns true if all types and operators are built-in.
void GB_enumify_reduce // enumerate a GrB_reduce problem
(
// output:
uint64_t *method_code, // unique encoding of the entire problem
// input:
GrB_Monoid monoid, // the monoid to enumify
GrB_Matrix A // input matrix to monoid
)
{
//--------------------------------------------------------------------------
// get the monoid and type of A
//--------------------------------------------------------------------------
GrB_BinaryOp reduceop = monoid->op ;
GrB_Type atype = A->type ;
GrB_Type ztype = reduceop->ztype ;
GB_Opcode reduce_opcode = reduceop->opcode ;
// these must always be true for any monoid:
ASSERT (reduceop->xtype == reduceop->ztype) ;
ASSERT (reduceop->ytype == reduceop->ztype) ;
//--------------------------------------------------------------------------
// rename redundant boolean operators
//--------------------------------------------------------------------------
// consider z = op(x,y) where both x and y are boolean:
GB_Type_code zcode = ztype->code ;
if (zcode == GB_BOOL_code)
{
// rename the monoid
reduce_opcode = GB_boolean_rename (reduce_opcode) ;
}
//--------------------------------------------------------------------------
// enumify the monoid
//--------------------------------------------------------------------------
ASSERT (reduce_opcode >= GB_USER_binop_code) ;
ASSERT (reduce_opcode <= GB_BXNOR_binop_code) ;
int red_code = (reduce_opcode - GB_USER_binop_code) & 0xF ;
const char *a = NULL, *cuda_type = NULL ;
bool user_monoid_atomically = false ;
bool has_cheeseburger = GB_enumify_cuda_atomic (&a,
&user_monoid_atomically, &cuda_type,
monoid, reduce_opcode, ztype->size, zcode) ;
int cheese = (has_cheeseburger) ? 1 : 0 ;
//--------------------------------------------------------------------------
// enumify the type and sparsity structure of A
//--------------------------------------------------------------------------
int acode = atype->code ; // 0 to 14
int asparsity ;
GB_enumify_sparsity (&asparsity, GB_sparsity (A)) ;
int azombies = (A->nzombies > 0) ? 1 : 0 ;
// the reduce methods do not access A->p or A->h
int ai_is_32 = (A->i_is_32) ? 1 : 0 ;
//--------------------------------------------------------------------------
// construct the reduction method_code
//--------------------------------------------------------------------------
// total method_code bits: 17 (5 hex digits)
(*method_code) =
// range bits
// monoid: 5 bits (2 hex digits)
GB_LSHIFT (cheese , 16) | // 0 to 1 1
GB_LSHIFT (red_code , 12) | // 0 to 13 4
// type of the monoid: 1 hex digit
GB_LSHIFT (zcode , 8) | // 0 to 14 4
// type of A: 1 hex digit
GB_LSHIFT (acode , 4) | // 0 to 14 4
// sparsity structure, 32/64 bit, and zombies: 1 hex digit
GB_LSHIFT (ai_is_32 , 3) | // 0 to 1 1
GB_LSHIFT (azombies , 2) | // 0 to 1 1
GB_LSHIFT (asparsity , 0) ; // 0 to 3 2
}
|