C++ 如何在C++;
我有一些CUDA函数的小问题 我想将C++ 如何在C++;,c++,cuda,nvidia,C++,Cuda,Nvidia,我有一些CUDA函数的小问题 我想将.cu文件与.cu文件和.cpp文件中的Nvidia示例分开。内核是一个函数模板。当我在C++文件中声明它是一个外部函数时,我会出错。 定义如下: template <int BLOCK_SIZE> __global__ void matrixMulCUDA(float *C, float *A, float *B, int wA, int wB) template <int BLOCK_SIZE> extern void matr
.cu
文件与.cu
文件和.cpp
文件中的Nvidia示例分开。内核是一个函数模板。当我在C++文件中声明它是一个外部函数时,我会出错。
定义如下:
template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
template <int BLOCK_SIZE> extern void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB);
if (block_size == 16)
{
matrixMulCUDA <16> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
else
{
matrixMulCUDA <32> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
template\uuuuu全局\uuuuuu\void
matrixMulCUDA(浮点*C、浮点*A、浮点*B、整数wA、整数wB)
我在C++中声明了这样的函数:
template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
template <int BLOCK_SIZE> extern void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB);
if (block_size == 16)
{
matrixMulCUDA <16> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
else
{
matrixMulCUDA <32> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
模板外部无效
matrixMulCUDA(浮点*C、浮点*A、浮点*B、整数wA、整数wB);
声明没有给我任何错误,但是当它像这样使用时:
template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
template <int BLOCK_SIZE> extern void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB);
if (block_size == 16)
{
matrixMulCUDA <16> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
else
{
matrixMulCUDA <32> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
if(块大小==16)
{
matrixMulCUDA>>(d_C、d_A、d_B、dimsA.x、dimsB.x);
}
其他的
{
matrixMulCUDA>>(d_C、d_A、d_B、dimsA.x、dimsB.x);
}
它告诉我“syntax error”这个问题并不是太具体,但是内核调用调用(问题中显示的代码)似乎在
.cpp
文件中,而不是.cu
文件中
<>如果是这样的话,那么代码< >名称(ARGs)的CUDA内核启动语法是NVCC的一个句法结构,而不是主机C++编译器。因此,使用它的任何代码都必须由NVCC处理,NVCC通常转换为<代码> Cu//C>文件而不是普通<代码> CPP > /P>
<>你必须把内核调用代码移动到一个template <int BLOCK_SIZE> __global__ void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB)
template <int BLOCK_SIZE> extern void
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB);
if (block_size == 16)
{
matrixMulCUDA <16> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
else
{
matrixMulCUDA <32> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
共享头文件
void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB);
void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB)
{
if (block_size == 16)
{
matrixMulCUDA <16> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
else
{
matrixMulCUDA <32> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
}
// In some function somewhere
callMatrixMulKernel(16, d_C, d_A, d_B, dimsA.x, dimsB.x);
.cu
文件
void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB);
void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB)
{
if (block_size == 16)
{
matrixMulCUDA <16> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
else
{
matrixMulCUDA <32> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x);
}
}
// In some function somewhere
callMatrixMulKernel(16, d_C, d_A, d_B, dimsA.x, dimsB.x);
请解释一下,
>
在您使用matrixMulCuda
时应该意味着什么。是.cu
文件中的“像这样使用”代码,还是.cpp
文件?@AlgirdasPreidžius它的CUDA内核调用语法(插入一个奇怪的空格).@Angew,代码来自CUDA示例。@Adi可以,但在分割文件后,代码是在.cu
文件中还是在.cpp
文件中?