//------------------------------------------------------------------------------ // GB_task_struct.h: parallel task descriptor //------------------------------------------------------------------------------ // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ #ifndef GB_TASK_STRUCT_H #define GB_TASK_STRUCT_H // The element-wise computations (GB_add, GB_emult, and GB_mask) compute // C(:,j) = op (A (:,j), B(:,j)). They are parallelized by slicing the // work into tasks, described by the GB_task_struct. // There are two kinds of tasks. For a coarse task, kfirst <= klast, and the // task computes all vectors in C(:,kfirst:klast), inclusive. None of the // vectors are sliced and computed by other tasks. For a fine task, klast is // -1. The task computes part of the single vector C(:,kfirst). It starts at // pA in Ai,Ax, at pB in Bi,Bx, and (if M is present) at pM in Mi,Mx. It // computes C(:,kfirst), starting at pC in Ci,Cx. // GB_subref also uses the TaskList. It has 12 kinds of fine tasks, // corresponding to each of the 12 methods used in GB_subref_template. For // those fine tasks, method = -TaskList [taskid].klast defines the method to // use. // The GB_subassign functions use the TaskList, in many different ways. typedef struct // task descriptor { int64_t kfirst ; // C(:,kfirst) is the first vector in this task. int64_t klast ; // C(:,klast) is the last vector in this task. int64_t pC ; // fine task starts at Ci, Cx [pC] int64_t pC_end ; // fine task ends at Ci, Cx [pC_end-1] int64_t pM ; // fine task starts at Mi, Mx [pM] int64_t pM_end ; // fine task ends at Mi, Mx [pM_end-1] int64_t pA ; // fine task starts at Ai, Ax [pA] int64_t pA_end ; // fine task ends at Ai, Ax [pA_end-1] int64_t pB ; // fine task starts at Bi, Bx [pB] int64_t pB_end ; // fine task ends at Bi, Bx [pB_end-1] int64_t len ; // fine task handles a subvector of this length } GB_task_struct ; //------------------------------------------------------------------------------ // GB_GET_VECTOR: get the content of a vector for a coarse/fine task //------------------------------------------------------------------------------ #define GB_GET_VECTOR(pX_start, pX_fini, pX, pX_end, Xp, kX, Xvlen) \ int64_t pX_start, pX_fini ; \ if (fine_task) \ { \ /* A fine task operates on a slice of X(:,k) */ \ pX_start = TaskList [taskid].pX ; \ pX_fini = TaskList [taskid].pX_end ; \ } \ else \ { \ /* vectors are never sliced for a coarse task */ \ pX_start = GBP (Xp, kX, Xvlen) ; \ pX_fini = GBP (Xp, kX+1, Xvlen) ; \ } #endif