File: interface_v1.cpp

package info (click to toggle)
magma 2.9.0%2Bds-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 83,212 kB
  • sloc: cpp: 709,115; fortran: 121,916; ansic: 32,343; python: 25,603; f90: 15,208; makefile: 942; xml: 253; csh: 232; sh: 203; perl: 104
file content (189 lines) | stat: -rw-r--r-- 5,706 bytes parent folder | download
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