cuda — смесь кода на c ++ и cublas не компилируется

Итак, у меня есть этот код, который предполагает вычисление точечного произведения матрицы различными способами (одним из которых является использование blas в c ++), но когда я пытаюсь использовать nvcc для компиляции кода, он не работает, и это говорит, что у меня есть неопределенная ссылка на ddot. Это странно, потому что я уверен, что использую нотацию вызова, указанную здесь для cublas: http://www.sdsc.edu/us/training/assets/docs/NVIDIA-03-Toolkit.pdf

Может кто-нибудь мне помочь? Вот фрагмент кода, с которым у меня возникли проблемы:

#include <cublas.h> //just some included files here. No problems with these
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

extern "C" //This is where I mention the cublas functions are external.
//I think this is necessary since I also have cuda pieces of code
{
double cublasDDOT_(int *n, double *A, int *incA, double *B, int *incB);

void cublasDAXPY_(int *n, double *a, double *A, int *incA, double *B, int *incB);
}

//Stuff happens here

C[i][t]=cublasDDOT_(&n, partA, &incA, partB, &incB); //This is a piece of my function and where the compiler chokes up

Это странно для меня. Я также попытался удалить «_» без удачи.

Вот команда компиляции, которую я использую: nvcc program

Нужно ли упоминать библиотеку cublas во время компиляции? У меня установлен инструментарий CUDA, но я не знаю, как ссылаться на библиотеку, кроме как с

#include <cublas.h>

Новое обновление

Оказывается, я получаю один и тот же вывод, включаю ли я заголовок cublas.h или нет

Я также получаю тот же вывод, набираю ли я -lcublas или нет

Вот вывод, который является мусором для всех компиляций (с / без cublas.h & с / без -lcublas)

nvcc project4.cu -lcublas
/tmp/tmpxft_000051cb_00000000-14_project4.o: In function `ddot(int&, int&, int&, double**&, double**&, double**&, double*&, double*&, int&, int&, double&, double&, double*)':
tmpxft_000051cb_00000000-3_project4.cudafe1.cpp:(.text+0xda1): undefined reference to `cublasDDOT'
/tmp/tmpxft_000051cb_00000000-14_project4.o: In function `daxpy(int&, int&, int&, double**&, double**&, double**&, double**&, double*&, double*&, int&, int&, double&, double&, double*)':
tmpxft_000051cb_00000000-3_project4.cudafe1.cpp:(.text+0xff3): undefined reference to `cublasDAXPY'
collect2: ld returned 1 exit status

0

Решение

Даже при компиляции с nvcc вам все равно нужно указать -lcublas переключатель связи.

Похоже, вы неправильно вызываете имена функций:

cublasDDOT_()

должно быть:

cublasDdot()

а также:

cublasDAXPY_()

должно быть:

cublasDaxpy()

В именах учитывается регистр.

Если вы не уверены в правильности именования, обратитесь к документация и посмотрите на использование в образцы кодов

И да, уберите подчеркивание. Я не понимаю, почему вы так называете имена функций. Если вы искали имя, компоновщик не знает, на что вы собираетесь его связать.

Я также не уверен, что что-то из «внешнего C» необходимо. Это зависит от того, что еще происходит в вашем проекте, но я не думаю, что вы должны использовать «extern C», обернутый вокруг функций, которые вы намереваетесь связать с библиотекой cublas, если вы компилируете / связываете с помощью nvcc

1

Другие решения

Других решений пока нет …