Как передать общий указатель на функцию cublas?

Я пытаюсь запустить функцию cublas из ядра следующим образом:

__device__ void doLinear(const float *W,const float *input, unsigned i, float *out, unsigned o) {
    unsigned idx = blockIdx.x*blockDim.x+threadIdx.x;

    const float alpha = 1.0f;
    const float beta = 0.0f;

    if(idx == 0) {
        cublasHandle_t cnpHandle;
        cublasStatus_t status = cublasCreate(&cnpHandle);
        cublasSgemv(cnpHandle, CUBLAS_OP_N, o, i, &alpha, W, 1, input, 1, &beta, out, 1);
    }
    __syncthreads();
}

Эта функция прекрасно работает, если input указатель выделяется с помощью cudaMalloc.

Моя проблема, если input Указатель фактически указывает на некоторую разделяемую память, которая содержит данные, сгенерированные изнутри ядра, я получаю ошибку:CUDA_EXCEPTION_14 - Warp Illegal address,

Разве нельзя передать указатели на разделяемую память функции cublas, вызываемой из ядра?

Как правильно распределить мою память здесь? (В данный момент я просто делаю еще один cudaMalloc и использую его как свою "общую" память, но это заставляет меня чувствовать себя немного грязно)

1 ответ

Решение

Вы не можете передать общую память подпрограмме API устройства CUBLAS, потому что она нарушает модель памяти динамического параллелизма CUDA, на которой основана CUBLAS на стороне устройства. Лучшее, что вы можете сделать, это использовать malloc() или же new выделять локальную память потока в динамической куче для используемой подпрограммы CUBLAS или часть априори выделенного буфера, выделенного с помощью одного из API на стороне хоста (как вы делаете в настоящее время).

Другие вопросы по тегам