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__
и компиляция с использованием всех различных вариантов архитектуры, и ни один из них не решает проблему.