_extras.c 1.15 KB
Newer Older
dugupeiwen's avatar
dugupeiwen committed
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
/*
 * Helper binding to call some CUDA Runtime API that cannot be directly
 * encoded using ctypes.
 */

#include "_pymodule.h"


#define CUDA_IPC_HANDLE_SIZE 64

typedef int CUresult;
typedef void* CUdeviceptr;

typedef struct CUipcMemHandle_st{
    char reserved[CUDA_IPC_HANDLE_SIZE];
} CUipcMemHandle;

typedef CUresult (*cuIpcOpenMemHandle_t)(CUdeviceptr* pdptr, CUipcMemHandle handle, unsigned int flags );

static
cuIpcOpenMemHandle_t cuIpcOpenMemHandle = 0;

static
void set_cuIpcOpenMemHandle(void* fnptr)
{
    cuIpcOpenMemHandle = (cuIpcOpenMemHandle_t)fnptr;
}

static
CUresult call_cuIpcOpenMemHandle(CUdeviceptr* pdptr, CUipcMemHandle* handle, unsigned int flags)
{
    return cuIpcOpenMemHandle(pdptr, *handle, flags);
}


MOD_INIT(_extras) {
    PyObject *m;
    MOD_DEF(m, "_extras", "No docs", NULL)
    if (m == NULL)
        return MOD_ERROR_VAL;
    PyModule_AddObject(m, "set_cuIpcOpenMemHandle", PyLong_FromVoidPtr(&set_cuIpcOpenMemHandle));
    PyModule_AddObject(m, "call_cuIpcOpenMemHandle", PyLong_FromVoidPtr(&call_cuIpcOpenMemHandle));
    PyModule_AddIntConstant(m, "CUDA_IPC_HANDLE_SIZE", CUDA_IPC_HANDLE_SIZE);
    return MOD_SUCCESS_VAL(m);
}