Include a static cuda library into a c++ project

荒凉一梦 提交于 2019-12-01 14:49:31

Here's a set of instructions that should help:

A. Create library project:

  1. select File...New...CUDA C/C++ Project
  2. Select Static Library...Empty Project and give the project a name (test8)
  3. Next...Next...Finish to finish creating the project
  4. right click on project name in Project Explorer window, select New...Header File, give it a name (test8lib.h)
  5. edit test8lib.h (with contents from below), save it
  6. create another new header file for cuda template, (test8.cuh)
  7. edit test8.cuh (with contents from below), save it
  8. create a new source file, (test8.cu)
  9. edit test8.cu (with contents from below), save it
  10. select Project...Build Project (libtest8.a is now built)

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. Create main project:

  1. File...new...C++ project...empty project...Linux GCC toolchain, give it a name (test9)
  2. Next...Finish to finish creating the project
  3. File...New Source File...Default C++ source template, give it a name (test9.cpp)
  4. edit the file with contents from below, save it.
  5. add the include path: Project...Properties...Build...Settings...Tool Settings...GCC C++ Compiler...Includes...Include Paths...Add and add the directory where test8lib.h is located.
  6. add the lib: Tool Settings...GCC C++ Linker...Libraries...Libraries...Add and add the name of the previously built library (test8)
  7. also add CUDA runtime library (cudart)
  8. add the lib path: Tool Settings...GCC C++ Linker...Libraries...Library Paths...Add and add the path to the previously built library (e.g. /path/to/cuda-workspace/test8/Debug)
  9. also add the path to cudart (e.g. /usr/local/cuda/lib64)
  10. Build Project
  11. Run Project

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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!