请教各位一下,在linux下如何将.cpp和.cu文件一起编译啊

菜鸟-xl 2018-04-24 03:24:20
各位好,是这样的,我写了五个文件,分别是.cpp和.cu的,但是不知道如何一起编译,上网找了好长时间也没有找到解决方法,因为我在Linux下运行,没有图形界面,不能在VS上编译,实在没辙了,只好请教一下各位

#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <math.h>
#include "GPUTSPSolver.h"
using namespace std;
CGPUTSPSolver solverGPU;
int main(int argc, char **argv)
{
solverGPU.CleanCudaMemory();
solverGPU.PrepareCudaMemory();
solverGPU.GeneInitCudaMemory();
solverGPU.CleanCudaMemory();
return 0;
}
这个是main.cpp

#ifndef _GPU_TSP_SOLVER
#define _GPU_TSP_SOLVER
#endif
#ifdef WIN32
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#endif
#include "GPUTSPSolverKernel.cuh"
class CGPUSolver {
int THREADSPERBLOCK;
int nMaxPoplation;
int *d_gene;
int *d_gene_randi;
int *h_gene;
int *h_gene_randi;
curandState *d_cudaState;
public:
void GenInitCudaMemory(void);
void CleanCudaMemory(void);
void PrepareCudaMemory(void);
void GeneInitCudaMemory(void);
CGPUSolver();
~CGPUSolver();
}

这个是GPUTSPSolver.h

#include "GPUTSPSolver.h"
#include <stdio.h>
#include <stdlib.h>
CGPUTSPSolver::CGPUTSPSolver(){
THREADSPERBLOCK = 256;
d_gene = NULL;
d_cudaState = NULL;
d_gene_randi = NULL;
h_gene = NULL;
h_gene_randi = NULL;
}
CGPUTSPSolver::~CGPUTSPSolver() {
}
void CGPUTSPSolver::CleanCudaMemory(void){
printf("cleaning cuda memories\n");
if (d_gene) cudaFree(d_gene);
if (d_gene_randi) cudaFree(d_gene_randi);
if (d_cudaState) cudaFree(d_cudaState);
if (h_gene) free(h_gene);
if (h_gene_randi) free(h_gene_randi);
}
void CGPUTSPSolver::PrepareCudaMemory(void){
printf("preparing cuda memories...\n");
cudaMalloc((void **)&d_gene , 2048 * 100 * sizeof(int));
cudaMalloc((void **)&d_gene_randi , 2048 * 100 * sizeof(int));
cudaMalloc((void **)&d_cudaState, sizeof(curandState));
h_gene = (int *) malloc(2048 * 100 * sizeof(int));
h_gene_randi = (int *) malloc(2048 * 100 * sizeof(int));
printf("cuda device memory successfully allocated (%d cities, %d genes)\n", 100, 2018);
}
void CGPUTSPSolver::GeneInitCudaMemory(void) {
int blocksPerGrid = (2048 + THREADSPERBLOCK - 1) / THREADSPERBLOCK;
if (!d_gene) printf("no gene memory\n");
printf("gene initialization with %d threads per block x (%d blocks)\n", THREADSPERBLOCK, blocksPerGrid);
d_geneInit(blocksPerGrid, THREADSPERBLOCK, d_cudaState, 2048, 100, d_gene, d_gene_randi);
printf("initSolver GPU\n");
cudaMemcpy(h_gene_randi, d_gene_randi, sizeof(int)*2048*100, cudaMemcpyDeviceToHost);
for(int i = 0;i<204800;i++){
printf("h_gene_randi[%d] = %d\n", i, h_gene_randi[i]);
};
printf("randi!");
}

这个是GPUTSPSolver.cpp

#include "GPUTSPSolverKernel.cuh"

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <curand.h>
#include <curand_kernel.h>


#include <stdio.h>
#include <math.h>

void d_geneInit(int blocks, int threads, curandState *pState, unsigned int nPopulation, unsigned int numCities, int *gene, int *d_gene_randi) {

printf("gene initialization at device started....\n");
d_geneInitKernel << < blocks, threads >> >(pState, nPopulation, numCities, gene, d_gene_randi);
printf("gene initialization at device done\n");
}

__global__ void d_geneInitKernel(curandState_t *pstate, unsigned int nPopulation, unsigned int numCities, int *gene, int *d_gene_randi) {

// tId: gene idx ( tId-th gene with numCities elements)
int tId = threadIdx.x + blockIdx.x * blockDim.x;
if (tId >= nPopulation) return;

// gene initialization - cards straight
for (int i = 0; i < numCities; i++) {
gene[tId*numCities+i] = i;
}

// gene shuffle
for (int i = 1; i < numCities; i++) {
int rIdx = randi(pstate, threadIdx.x+blockIdx.x+blockDim.x, (unsigned int) 1, (unsigned int) numCities - 1);
d_gene_randi[tId*numCities + i] = rIdx;
int t = gene[tId*numCities + i];
gene[tId * numCities + i] = gene[tId * numCities + rIdx];
gene[tId * numCities + rIdx] = t;
}
}

__device__ unsigned int randi(curandState *pState, int add, int min, int max) {
curandState localState = *pState;
unsigned int rndval = min + (curand(&localState) * add + add)%(max-min+1);
*pState = localState;
return rndval;
}

这个是GPUTSPSollverKernel.cu


#ifndef _GPUTSPKERNEL__H_2015_YMKANG__
#define _GPUTSPKERNEL__H_2015_YMKANG__
#endif

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <curand.h>
#include <curand_kernel.h>

void d_geneInit(int blocks, int threads, curandState *pState, unsigned int nPopulation, unsigned int numCities, int *gene,int *d_gene_randi);
__global__ void d_geneInitKernel(curandState_t *state, unsigned int nPopulation, unsigned int numCities, int *gene, int *d_gene_randi);
__device__ unsigned int randi(curandState *pState, int add, int min, int max);

这个是GPUTSPSollverKernel.cuh
求教各位了,怎么把它们一起编译啊?
...全文
1274 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mazinkaiser1991 2018-12-12
  • 打赏
  • 举报
回复
问题解决了吗?在linux上需要分别编译成.o,然后链接成可执行文件。
「已注销」 2018-12-11
  • 打赏
  • 举报
回复
lz找到办法了吗,我也在愁这个o(╥﹏╥)o

374

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Linux
社区管理员
  • CUDA on Linux社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧