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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
/*
-- MAGMA (version 2.9.0) --
Univ. of Tennessee, Knoxville
Univ. of California, Berkeley
Univ. of Colorado, Denver
@date January 2025
@author Mark Gates
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
// these are included already in magma_internal.h & other headers
#include <cuda_runtime.h>
//#include <cublas_v2.h>
#include "magma_internal.h"
#include "error.h"
#if defined(MAGMA_HAVE_CUDA) || defined(MAGMA_HAVE_HIP)
#ifndef MAGMA_NO_V1
// -----------------------------------------------------------------------------
// globals
// see interface.cpp for definitions
#ifndef MAGMA_NO_V1
extern magma_queue_t* g_null_queues;
#ifdef HAVE_PTHREAD_KEY
extern pthread_key_t g_magma_queue_key;
#else
extern magma_queue_t g_magma_queue;
#endif
#endif // MAGMA_NO_V1
// -----------------------------------------------------------------------------
extern int g_magma_devices_cnt;
// =============================================================================
// device support
/***************************************************************************//**
@deprecated
Synchronize the current device.
This functionality does not exist in OpenCL, so it is deprecated for CUDA, too.
@ingroup magma_device
*******************************************************************************/
extern "C" void
magma_device_sync()
{
cudaError_t err;
err = cudaDeviceSynchronize();
check_error( err );
MAGMA_UNUSED( err );
}
// =============================================================================
// queue support
/***************************************************************************//**
@deprecated
Sets the current global MAGMA v1 queue for kernels to execute in.
In MAGMA v2, all kernels take queue as an argument, so this is deprecated.
If compiled with MAGMA_NO_V1, this is not defined.
@param[in]
queue Queue to set as current global MAGMA v1 queue.
@return MAGMA_SUCCESS if successful
@ingroup magma_queue
*******************************************************************************/
extern "C" magma_int_t
magmablasSetKernelStream( magma_queue_t queue )
{
magma_int_t info = 0;
#ifdef HAVE_PTHREAD_KEY
info = pthread_setspecific( g_magma_queue_key, queue );
#else
g_magma_queue = queue;
#endif
return info;
}
/***************************************************************************//**
@deprecated
Gets the current global MAGMA v1 queue for kernels to execute in.
In MAGMA v2, all kernels take queue as an argument, so this is deprecated.
If compiled with MAGMA_NO_V1, this is not defined.
@param[out]
queue_ptr On output, set to the current global MAGMA v1 queue.
@return MAGMA_SUCCESS if successful
@ingroup magma_queue
*******************************************************************************/
extern "C" magma_int_t
magmablasGetKernelStream( magma_queue_t *queue_ptr )
{
#ifdef HAVE_PTHREAD_KEY
*queue_ptr = (magma_queue_t) pthread_getspecific( g_magma_queue_key );
#else
*queue_ptr = g_magma_queue;
#endif
return 0;
}
/***************************************************************************//**
@deprecated
Gets the current global MAGMA v1 queue for kernels to execute in.
Unlike magmablasGetKernelStream(), if the current queue is NULL,
this will return a special MAGMA queue that has a NULL CUDA stream.
This allows MAGMA v1 wrappers to call v2 kernels with a non-NULL queue.
In MAGMA v2, all kernels take queue as an argument, so this is deprecated.
If compiled with MAGMA_NO_V1, this is not defined.
@return Current global MAGMA v1 queue.
@ingroup magma_queue
*******************************************************************************/
extern "C"
magma_queue_t magmablasGetQueue()
{
magma_queue_t queue;
#ifdef HAVE_PTHREAD_KEY
queue = (magma_queue_t) pthread_getspecific( g_magma_queue_key );
#else
queue = g_magma_queue;
#endif
if ( queue == NULL ) {
magma_device_t dev;
magma_getdevice( &dev );
if ( dev >= g_magma_devices_cnt || g_null_queues == NULL ) {
fprintf( stderr, "Error: %s requires magma_init() to be called first for MAGMA v1 compatability.\n",
__func__ );
return NULL;
}
// create queue w/ NULL stream first time that NULL queue is used
if ( g_null_queues[dev] == NULL ) {
#ifdef MAGMA_HAVE_CUDA
magma_queue_create_from_cuda( dev, NULL, NULL, NULL, &g_null_queues[dev] );
#elif defined(MAGMA_HAVE_HIP)
magma_queue_create_from_hip( dev, NULL, NULL, NULL, &g_null_queues[dev] );
#endif
//printf( "dev %lld create queue %p\n", (long long) dev, (void*) g_null_queues[dev] );
assert( g_null_queues[dev] != NULL );
}
queue = g_null_queues[dev];
}
assert( queue != NULL );
return queue;
}
/***************************************************************************//**
@deprecated
MAGMA v1 version that doesn't take device ID.
*******************************************************************************/
extern "C" void
magma_queue_create_v1_internal(
magma_queue_t* queue_ptr,
const char* func, const char* file, int line )
{
int device;
cudaError_t err;
err = cudaGetDevice( &device );
check_xerror( err, func, file, line );
MAGMA_UNUSED( err );
magma_queue_create_internal( device, queue_ptr, func, file, line );
}
#endif // not MAGMA_NO_V1
#endif // MAGMA_HAVE_CUDA
|