Here's a set of instructions that should help:
A. Create library project:
- select File...New...CUDA C/C++ Project
- Select Static Library...Empty Project and give the project a name (test8)
- Next...Next...Finish to finish creating the project
- right click on project name in Project Explorer window, select New...Header File, give it a name (test8lib.h)
- edit test8lib.h (with contents from below), save it
- create another new header file for cuda template, (test8.cuh)
- edit test8.cuh (with contents from below), save it
- create a new source file, (test8.cu)
- edit test8.cu (with contents from below), save it
- 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:
- File...new...C++ project...empty project...Linux GCC toolchain, give it a name (test9)
- Next...Finish to finish creating the project
- File...New Source File...Default C++ source template, give it a name (test9.cpp)
- edit the file with contents from below, save it.
- 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.
- add the lib: Tool Settings...GCC C++ Linker...Libraries...Libraries...Add and add the name of the previously built library (test8)
- also add CUDA runtime library (cudart)
- 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
)
- also add the path to cudart (e.g.
/usr/local/cuda/lib64
)
- Build Project
- 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;
}