/*! * listJoin() * * Input: &head1 (<may be changed> head of first list) * &head2 (<to be nulled> head of second list) * Return: 0 if OK, 1 on error * * Notes: * (1) The concatenated list is returned with head1 as the new head. * (2) Both input ptrs must exist, though either can have the value NULL. */ l_int32 listJoin(DLLIST **phead1, DLLIST **phead2) { void *obj; DLLIST *head1, *head2, *tail1; PROCNAME("listJoin"); if (!phead1) return ERROR_INT("&head1 not defined", procName, 1); if (!phead2) return ERROR_INT("&head2 not defined", procName, 1); /* If no list2, just return list1 unchanged */ if ((head2 = *phead2) == NULL) return 0; /* If no list1, just return list2 */ if ((head1 = *phead1) == NULL) { *phead1 = head2; *phead2 = NULL; return 0; } /* General case for concatenation into list 1 */ tail1 = listFindTail(head1); while (head2) { obj = listRemoveFromHead(&head2); listAddToTail(&head1, &tail1, obj); } *phead2 = NULL; return 0; }
static clblasStatus doSymv( CLBlasKargs *kargs, clblasOrder order, clblasUplo uplo, size_t N, const cl_mem A, size_t offA, size_t lda, const cl_mem x, size_t offx, int incx, cl_mem y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue *commandQueues, cl_uint numEventsInWaitList, const cl_event *eventWaitList, cl_event *events) { cl_int err; ListHead seq; clblasStatus retCode = clblasSuccess; #ifdef USE_SYMV ListHead seq2; ListNode *listNodePtr; cl_event first_event; #endif if (!clblasInitialized) { return clblasNotInitialized; } /* Validate arguments */ if ((retCode = checkMemObjects(A, x, y, true, A_MAT_ERRSET, X_VEC_ERRSET, Y_VEC_ERRSET))) { return retCode; } if ((retCode = checkMatrixSizes(kargs->dtype, order, clblasNoTrans, N, N, A, offA, lda, A_MAT_ERRSET ))) { return retCode; } if ((retCode = checkVectorSizes(kargs->dtype, N, x, offx, incx, X_VEC_ERRSET ))) { return retCode; } if ((retCode = checkVectorSizes(kargs->dtype, N, y, offy, incy, Y_VEC_ERRSET ))) { return retCode; } kargs->order = order; kargs->uplo = uplo; kargs->N = N; kargs->K = N; //store original N kargs->A = A; kargs->offA = offA; kargs->offa = offA; kargs->lda.matrix = lda; kargs->B = x; kargs->offBX = offx; kargs->ldb.vector = incx; kargs->C = y; kargs->offCY = offy; kargs->ldc.vector = incy; #ifndef USE_SYMV listInitHead(&seq); err = makeSolutionSeq(CLBLAS_SYMV, kargs, numCommandQueues, commandQueues, numEventsInWaitList, eventWaitList, events, &seq); if (err == CL_SUCCESS) { err = executeSolutionSeq(&seq); } #else // version of SYMV using kprintf numCommandQueues = 1; listInitHead(&seq); kargs->transA = clblasNoTrans; kargs->diag = clblasNonUnit; err = makeSolutionSeq(CLBLAS_HEMV, kargs, numCommandQueues, commandQueues, numEventsInWaitList, eventWaitList, &first_event, &seq); if (err == CL_SUCCESS) { listInitHead(&seq2); kargs->transA = clblasTrans; kargs->diag = clblasUnit; err = makeSolutionSeq(CLBLAS_HEMV, kargs, numCommandQueues, commandQueues, 1, &first_event, events, &seq2); if (err == CL_SUCCESS) { // Adding node from seq2 to main seq listNodePtr = listNodeFirst(&seq2); listAddToTail(&seq, listNodePtr); err = executeSolutionSeq(&seq); // Executes both kernels in the seq one after other } } #endif freeSolutionSeq(&seq); return (clblasStatus)err; }