.CPP文件怎么调用.cu文件里的kernel函数?

main函数在CPP文件里想调用.cu文件里的__global__函数,编译总说“fatal error C1083: Cannot open include file: ‘cuda_runtime.h’: No such file or directory”,我把main和__global__函数都放在.cu文件里时编译运行正常。搜了一下,有人说在CPP文件里没法调用kernel函数,让在kernel函数的cu文件中写一个普通函数来调用它,然后在main函数的CPP文件中include那cu文件,调用那个普通函数。我这样做了,可是编译还是“kernel.cu(3) : fatal error C1083: Cannot open include file: ‘cuda_runtime.h’: No such file or directory”。有没有办法让CPP文件里的main来调用kernel函数呢?谢谢!

你可以使用2个.cu,同时开启rdc, 这样可以互相调用。

但如果是一个普通的C或者C++的源文件,另外一个是.cu的话,您只有在.cu里包装好您的kernel, 作为普通的C或者C++函数导出才能调用。

也就是说,网上你找的说法没错。

你的kernel.cu文件报错找不到cuda_runtime.h,最大的可能是你没有将他作为CUDA C/C++文件编译。(因为如果作为CUDA C/C++编译,你的toolkit下的include目录被会自动添加为搜索目录的,不会找不到的)。

简单的将一个.cpp文件改名.cu是不行的。

楼主你可以在安装好CUDA Toolkit后,直接用新建项目里的NVIDIA->CUDA模板来创建项目。
这样创建的.cu将为CUDA C/C++类型。

请重新从创建项目尝试(不要自己随意改名)

谢谢玫瑰姐,可是我按照NVIDIA->CUDA模板来重新创建项目,它自带了一个cu文件,我把global函数放在那里面然后又写了一个调用global函数的普通函数调用它,再然后添加了一个cpp文件,把main放在cpp文件里调用那个普通函数,结果还是那个错误!CPP文件可以include .cu文件吗?按照NVIDIA->CUDA模板创建的项目可以把main移到cpp文件吗?还有发现new item选项里没有.cu文件耶,如果还想添加.cu或.cuh怎么办呢?:L

你直接用模板创建出来的.cu文件通不过编译?这不可能!

还是您的描述有误,您添加的.cpp文件不能通过编译?

请您注意,如果是后者,您的.cpp文件不需要#include <cuda_runtime.h>的。

当我把main函数直接加在.cu文件中的时候编译通过了,可是把main提取出来放到添加的cpp文件中的时候就出现错误说不能打开include file cuda_runtime.h。请看看我的代码吧!(我向您保证我是用的模板创建出来的.cu文件,直接在那里写的)


//main.cpp

#include <stdlib.h>
#include "kernel.cu"

using namespace std;

void call_kernel();
int main(int argc, char **argv)
{	
	call_kernel();
	system("pause");
	return EXIT_SUCCESS;
}



********************************************************************************
//kernel.cu
#include <stdlib.h>
#include <stdio.h>
#include <cuda_runtime.h>

#define DATA_SIZE 1048576   //1M
#define BLOCK_NUM 16  //number of blocks
#define THREAD_NUM 16  //number of threads per block

__global__ void sumOfSquares(int *pnNumber, int *pnResult)
{
	extern __shared__ int nShared[];
	int tid=threadIdx.x;
	int bid=blockIdx.x;
	int i;
	int nOffset=1;
	nShared[tid]=0;
	for(i=bid*THREAD_NUM+tid; i<DATA_SIZE; i+=BLOCK_NUM*THREAD_NUM)
		nShared[tid]+=pnNumber[i]*pnNumber[i];
	__syncthreads();
	nOffset=THREAD_NUM/2;
	while(nOffset>0)
	{
		if (tid<nOffset)	nShared[tid]+=nShared[tid+nOffset];
		nOffset /=2;
		__syncthreads();
	}
}

void GenerateNumbers(int *number, int nsize)
{
	for(int i=0;i<nsize;i++) number[i]=rand()%10;
}

void CUDA_SAFE_CALL(cudaError_t err)
{
	if(cudaSuccess != err)
	{
		fprintf(stderr, "Cuda error in file '%s' in line %i: %s.\n", __FILE__, __LINE__, cudaGetErrorString(err));
		exit(EXIT_FAILURE);
	}
}

void call_kernel()
{
	int *pnData, *pnSum;
	CUDA_SAFE_CALL(cudaMallocHost((void**)&pnData, sizeof(int)*DATA_SIZE));
	GenerateNumbers(pnData, DATA_SIZE);
	CUDA_SAFE_CALL(cudaMallocHost((void**)&pnSum, sizeof(int)*BLOCK_NUM));

	int *pnGpuData, *pnResult;
	CUDA_SAFE_CALL(cudaMalloc((void**) &pnGpuData, sizeof(int)*DATA_SIZE));
	CUDA_SAFE_CALL(cudaMalloc((void**) &pnResult, sizeof(int)*BLOCK_NUM));
	CUDA_SAFE_CALL(cudaMemcpy(pnGpuData, pnData, sizeof(int)*DATA_SIZE, cudaMemcpyHostToDevice));

	sumOfSquares<<<BLOCK_NUM, THREAD_NUM, THREAD_NUM*sizeof(int)>>>(pnGpuData, pnResult);

	CUDA_SAFE_CALL(cudaMemcpy(pnSum, pnResult, sizeof(int)*BLOCK_NUM, cudaMemcpyDeviceToHost));

	int nFinalSum=0;
	for (int i=0; i<BLOCK_NUM; i++)		nFinalSum +=pnSum[i];

	printf("sum:%d\n", nFinalSum);

	CUDA_SAFE_CALL(cudaFree(pnResult));
	CUDA_SAFE_CALL(cudaFree(pnGpuData));
	CUDA_SAFE_CALL(cudaFreeHost(pnSum));
	CUDA_SAFE_CALL(cudaFreeHost(pnData));
}

深刻无语了。

谁让你在你的.cpp里#include你的.cu的?
又看了一些第三方的所谓教程了吧?

前文论坛给出的建议你都当废纸了?

此帖无需再讨论了。同时警告楼主一次。希望你能下次认真点看。

楼主请看2#玫瑰幻想给你的建议,里面第二段。

此段落说,需要使用一个普通的C或者C++函数将kernel调用包装,有说过让你把你的.cu文件再整体包含到.cpp里编译么?

楼主在昨日论坛给出了正确解决方案后。执意不听啊!!!
你这样不仅仅给我们造成麻烦(实际上无所谓,我们不怕,还是会继续服务您的),
你这也给你自己带来了深刻的麻烦。

遵守论坛给出的解决方案,不要中间再夹杂着第三方网站给出的任何建议!
也不要自己胡乱发挥。

论坛给出你的解决方案是完备的,不需要你自己乱找,乱发挥。
只需要你简单的尝试。

嗯,我也发现了,是我疏忽了,抱歉!现在已经改过来了也编译通过了,谢谢您的批评指教:)