4

cudaコードにヘッダーファイルを含めた.cファイルにある関数を呼び出すcudaコードがあります。つまり、ヘッダー ファイル、そのヘッダー ファイル用の C ファイル、および CUDA コードがあります。nvcc を使用して CUDA コードをコンパイルし、cuda コード名と c ファイル名を指定すると、実際に C ファイルに存在する CUDA コードで呼び出した関数への未定義の参照が取得されます。何が間違っているのか、どうすれば間違いを修正できるのかを理解してください。

わかりました、以下にコードを貼り付けます...リンカーエラーか何かだと思ったので、最初は投稿しませんでした。

 #include "dbConnection.h"
 #include "error.h"
 #include "libpq-fe.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include "appCompileSwitches.h"


int makeConnection(PGconn** conn,const char* connInfo);
void executeQuery(PGconn* conn,PGresult** res,char* statement,int* rows,int* columns);


/***************************************
* main(), enough said
****************************************/
int main(int argc, char **argv)
{

    PGconn *conn = NULL;
    PGresult *res= NULL;
    float** result;
    char* statement = "select visit_no,brand_name from visit_sample limit 3";
    int rows=0,columns=0; // WILL BE USED TO CUDAMALLOC gpu memory
    const char* connInfo = "dbname = moxy";

    if(!makeConnection(&conn,connInfo))
    {
            printf("failed to connect to Database!\n");
            return FAILURE;
    }
}

dbConnection.c ファイルには次のものがあります。

#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
#include <string.h>
#include "dbConnection.h"
#include "error.h"
#include "appCompileSwitches.h"

/****************************************************
* close database connection, given connecton info
****************************************************/
static void closeConnection(PGconn *conn)
{

    /* close the connection to the database and cleanup */
    PQfinish(conn);
}

/****************************************************
* connect to the database
* given the connInfo
****************************************************/
extern int makeConnection(PGconn** conn,const char* connInfo)
{
    /* Make a connection to the database */
    *conn = PQconnectdb(connInfo);
    if (PQstatus(*conn) != CONNECTION_OK)
    {
            fprintf(stderr, "Connection to database failed: %s",PQerrorMessage(*conn));
            PQfinish(*conn);
            return FAILURE;
    }
    return SUCCESS;
}

だから私がやっているとき:

nvcc DB.cu dbConnection.c -o DB 

接続するために未定義の参照を取得しています。また、後で DB から取得したデータを GPGPU に転送します。これがこの演習の要点なので、ここで CUDA 呼び出しがないとは言わないでください。これはまだ開発中のコードです。

4

1 に答える 1

5

外部関数は .c ファイルにあるため、ホスト コンパイラは C 言語の命名規則と呼び出し規則を使用してコンパイルします。一方、nvcc はデフォルトで C++ コンパイラであるため、デフォルトで C++ の命名/呼び出し規則が使用されます。makeConnectionC++ コンパイラに.cu ファイルのヘッダーおよび/または前方宣言で宣言することにより、外部の「C」関数を探すように指示する必要があります。

extern "C"
int makeConnection(PGconn** conn,const char* connInfo);
于 2012-09-21T05:38:25.757 に答える