File: GB_bitmap_select_template.c

package info (click to toggle)
suitesparse-graphblas 7.4.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 67,112 kB
  • sloc: ansic: 1,072,243; cpp: 8,081; sh: 512; makefile: 506; asm: 369; python: 125; awk: 10
file content (70 lines) | stat: -rw-r--r-- 2,438 bytes parent folder | download | duplicates (3)
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
//------------------------------------------------------------------------------
// GB_bitmap_select_template: C=select(A,thunk) if A is bitmap or full
//------------------------------------------------------------------------------

// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

//------------------------------------------------------------------------------

// Ab and Cb can be aliased, if A is bitmap and the selection is done in-place.
// Ax and Cx are not aliased.

// TODO: If done in-place, Cx can be passed as NULL.  Then if A is not bitmap,
// C->b needs to be allocated, but not C->x.

// TODO: use a single GB_memcpy for the values, regardless of selectop,
// if no typecasting is being done.

{
    int8_t *Ab = A->b ;
    GB_ATYPE *restrict Ax = (GB_ATYPE *) A->x ;
    const int64_t avlen = A->vlen ;
    const int64_t avdim = A->vdim ;
    const size_t asize = A->type->size ;
    const int64_t anz = avlen * avdim ;
    int64_t pA, cnvals = 0 ;
    #pragma omp parallel for num_threads(nthreads) schedule(static) \
        reduction(+:cnvals)
    for (pA = 0 ; pA < anz ; pA++)
    { 
        int64_t i = pA % avlen ;
        int64_t j = pA / avlen ;
        #if defined ( GB_ENTRY_SELECTOR )
            // test the existence and value of A(i,j) 
            GB_TEST_VALUE_OF_ENTRY (keep, pA) ;
        #endif
        int8_t cb = GBB (Ab, pA) &&
        #if defined ( GB_ENTRY_SELECTOR )
            keep ;
        #elif defined ( GB_TRIL_SELECTOR )
            (j-i <= ithunk) ;
        #elif defined ( GB_TRIU_SELECTOR )
            (j-i >= ithunk) ;
        #elif defined ( GB_DIAG_SELECTOR )
            (j-i == ithunk) ;
        #elif defined ( GB_OFFDIAG_SELECTOR )
            (j-i != ithunk) ;
        #elif defined ( GB_ROWINDEX_SELECTOR )
            (i+ithunk != 0) ;
        #elif defined ( GB_COLINDEX_SELECTOR )
            (j+ithunk != 0) ;
        #elif defined ( GB_COLLE_SELECTOR )
            (j <= ithunk) ;
        #elif defined ( GB_COLGT_SELECTOR )
            (j > ithunk) ;
        #elif defined ( GB_ROWLE_SELECTOR )
            (i <= ithunk) ;
        #elif defined ( GB_ROWGT_SELECTOR )
            (i > ithunk) ;
        #endif
        Cb [pA] = cb ;
        cnvals += cb ;
        { 
            // Cx [pA] = Ax [pA]
            GB_SELECT_ENTRY (Cx, pA, Ax, pA) ;
        }
    }
    (*cnvals_handle) = cnvals ;
}