Julia CUDArt - Скомпилируйте модуль ptx, используя функцию extern

Я пытаюсь создать модуль ptx для реализации функции CUBLAS, чтобы ответить на этот нерешенный в настоящее время вопрос SO. Я хочу иметь возможность определить функцию, которая затем может быть выполнена с помощью launch() или какая-то похожая утилита.

В качестве базового руководства я смотрю на эту страницу, где приведены примеры из скрипта, вызывающего функции CUBLAS. Я также смотрю на этот пример с сайта CUDArt GitHub для получения дополнительной информации. Мои текущие рабочие усилия выглядят примерно так:

#include <cublas_v2.h>
extern "C" 
// Multiply the arrays A and B on GPU and save the result in C
// C(m,n) = A(m,k) * B(k,n)
__device__ void gpu_blas_mmul(const float *A, const float *B, float *C, const int m, const int k, const int n) {
    int lda=m,ldb=k,ldc=m;
    const float alf = 1;
    const float bet = 0;
    const float *alpha = &alf;
    const float *beta  = &bet;

    // Create a handle for CUBLAS
    cublasHandle_t handle;
    cublasCreate(&handle);

    // Do the actual multiplication
    cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc);

    // Destroy the handle
    cublasDestroy(handle);
}

Затем я компилирую, а затем проверяю компиляцию, используя что-то вроде этого:

nvcc -ptx -gencode=arch=compute_35,code=sm_35 -lcublas gpu_blas_mmul.cu
ptxas -arch=sm_35 gpu_blas_mmul.ptx

Когда я это делаю, получаю следующую ошибку:

Unresolved extern function 'cublasCreate_v2'

Если я удалю __device__ с самого начала скрипта я больше не получаю ошибку. Но когда я тогда пытаюсь загрузить функцию в CUDArt, используя:

using CUDArt
md = CuModule("path/to/gpu_blas_mmul.ptx", false)
gpu_blas_mmul = CuFunction(md, "gpu_blas_mmul")

Я получаю ошибку:

ERROR: Named symbol not found

Я просмотрел этот и этот пост, а также этот ресурс. Я пробовал простые решения в них, такие как использование __deice__ __host__ в моем сценарии и -nc когда я собираю с nvcc, Однако я не углубился в статьи. Частично это связано с тем, что они, по-видимому, описывают значительно более сложные ситуации, используя несколько связанных сценариев. Это кажется более сложным, чем я считаю необходимым, и, кроме того, я даже не уверен, будет ли он успешным.

Я написал другие ядра и успешно скомпилировал и запустил их с помощью CUDArt раньше, но этот, который использует cuBLAS библиотека, кажется, побеждает меня.

Как я могу решить эти проблемы, чтобы я мог скомпилировать и затем запустить функцию, указанную в моем сценарии? Мне не ясно, какая часть этого процесса выходит из строя или даже я подхожу к этой проблеме вообще соответствующим образом.

Примечания: я также пытался заменить __device__ с __global__и компиляция с использованием всех различных вариантов архитектуры, и ни один из них не решает проблему.

0 ответов

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