簡體   English   中英

將靜態cuda庫包含到c ++項目中

[英]Include a static cuda library into a c++ project

我有一個模板化的靜態CUDA庫,我想將其包含在一個普通的c ++項目中。 當我包含庫的標頭時,編譯器崩潰並說“它無法解析特定於CUDA的符號”。 當然,g ++編譯器無法解釋這些符號。 我知道這個問題,但是我不知道如何使用nsight IDE解決此問題。

我在cuda / nvcc庫和c ++ / g ++項目中都使用了nsight。

控制台輸出:

make all 
Building file: ../src/MedPrak.cpp
Invoking: GCC C++ Compiler
g++ -I/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/MedPrak.d" -MT"src/MedPrak.d" -o "src/MedPrak.o" "../src/MedPrak.cpp"

In file included from ../src/cudaWrapper.cu:8:0,
                 from ../src/MedPrak.cpp:3:

/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src/kernel.h:15:23: error: ‘__global__’ does not name a type
 template <typename T> __global__ void squareVector(T *input, T *output, int size) {

編輯:忘記提及我有一個cuda項目,其文件與庫中的文件相同。 cuda項目可以正常編譯並正常運行,因此我認為代碼中沒有很大的錯誤。

Edit2:避免使用“模板庫”的想法。 我有一個包裝實際的模板類。 因此,沒有“空”庫。

這是一組說明,應該會有所幫助:

A.創建庫項目:

  1. 選擇文件...新建... CUDA C / C ++項目
  2. 選擇“靜態庫...空項目”,然后為項目命名(test8)
  3. 下一步...下一步...完成以完成項目的創建
  4. 在“項目資源管理器”窗口中右鍵單擊項目名稱,選擇“新建...頭文件”,為其命名(test8lib.h)
  5. 編輯test8lib.h(帶有下面的內容),保存
  6. 為cuda模板創建另一個新的頭文件,(test8.cuh)
  7. 編輯test8.cuh(內容如下),保存
  8. 創建一個新的源文件,(test8.cu)
  9. 編輯test8.cu(內容如下),保存
  10. 選擇項目...構建項目(現已構建libtest8.a)

test8lib.h:

#ifndef TEST8LIB_H_
#define TEST8LIB_H_

void calc_square_vec_float(float *in_data, float *out_data, int size);


#endif /* TEST8LIB_H_ */

test8.cuh:

#ifndef TEST8_CUH_
#define TEST8_CUH_

template <typename T> __global__ void squareVector(T *input, T *output, int size) {
    int idx = threadIdx.x+blockDim.x*blockIdx.x;
    if (idx < size) output[idx]=input[idx]*input[idx];
}


#endif /* TEST8_CUH_ */

test8.cu:

#include "test8lib.h"
#include "test8.cuh"
#define nTPB 256

void calc_square_vec_float(float *in_data, float *out_data, int size){
    float *d_in_data, *d_out_data;
    cudaMalloc(&d_in_data,  size*sizeof(float));
    cudaMalloc(&d_out_data, size*sizeof(float));
    cudaMemcpy(d_in_data, in_data, size*sizeof(float),cudaMemcpyHostToDevice);
    squareVector<<<(size+nTPB-1)/nTPB, nTPB>>>(d_in_data, d_out_data, size);
    cudaMemcpy(out_data, d_out_data, size*sizeof(float),cudaMemcpyDeviceToHost);
}

B.創建主項目:

  1. 文件...新... C ++項目...空項目... Linux GCC工具鏈,為其命名(test9)
  2. 下一步...完成創建項目
  3. 文件...新的源文件...默認的C ++源模板,為其命名(test9.cpp)
  4. 從下面編輯內容包含的文件,然后保存。
  5. 添加包含路徑:項目...屬性...生成...設置...工具設置... GCC C ++編譯器...包含...包含路徑...添加並添加目錄test8lib.h位於。
  6. 添加庫:工具設置... GCC C ++鏈接器...庫...庫...添加並添加以前構建的庫的名稱(test8)
  7. 還添加CUDA運行時庫(cudart)
  8. 添加庫路徑:工具設置... GCC C ++鏈接器...庫...庫路徑...添加路徑並將其添加到以前構建的庫(例如/path/to/cuda-workspace/test8/Debug
  9. 還添加到cudart的路徑(例如/usr/local/cuda/lib64
  10. 建設項目
  11. 運行項目

test9.cpp:

#include <stdio.h>
#include <stdlib.h>
#include "test8lib.h"
#define DSIZE 4
#define TEST_VAL 2.0f

int main(){
    float *in, *out;
    in = (float *)malloc(DSIZE*sizeof(float));
    out = (float *)malloc(DSIZE*sizeof(float));
    for (int i=0; i<DSIZE; i++){
        in[i] = TEST_VAL;
        out[i] = 0.0f;
    }
    calc_square_vec_float(in, out, DSIZE);
    for (int i=0; i<DSIZE; i++)
        if (out[i] != (float)(TEST_VAL*TEST_VAL)){
            printf("mismatch at %d, was: %f, should be: %f\n", i, out[i], (float)(TEST_VAL*TEST_VAL));
            return 1;
        }
    printf("Success!\n");
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM