能否在c+;中包含.cu扩展标题+;头球? 我有一个.Cu文件,当自己编译时,右击并选择编译,它编译得很好,但是当我有另一个头文件,一个C++头文件,调用这个.Cu文件时,生成失败。.cu文件属性已编辑为使用CUDA编译器生成。我得到的错误是“blockIdx”:未声明的标识符“blockDim”:未声明的标识符,等等。。基本上,我希望用C++编译器编译CUDA代码。那么,是否可以在C++头中包含一个CU-CUDA代码?

能否在c+;中包含.cu扩展标题+;头球? 我有一个.Cu文件,当自己编译时,右击并选择编译,它编译得很好,但是当我有另一个头文件,一个C++头文件,调用这个.Cu文件时,生成失败。.cu文件属性已编辑为使用CUDA编译器生成。我得到的错误是“blockIdx”:未声明的标识符“blockDim”:未声明的标识符,等等。。基本上,我希望用C++编译器编译CUDA代码。那么,是否可以在C++头中包含一个CU-CUDA代码?,c++,cuda,header-files,undeclared-identifier,C++,Cuda,Header Files,Undeclared Identifier,以下是.cu文件: Matrix.cu #include <cuda.h> #include <cuda_runtime.h> #include <cuda_device_runtime_api.h> #define BLOCKSIZE 32 using namespace std; template<typename T> class Matrix { public: typedef T value_type; ~Matrix(); M

以下是.cu文件:

Matrix.cu

#include <cuda.h>
#include <cuda_runtime.h>
#include <cuda_device_runtime_api.h>

#define BLOCKSIZE 32

using namespace std;



template<typename T> class Matrix
{
public:
typedef T value_type;
~Matrix();
Matrix();
Matrix(int rows, int columns);
int height;
int width;
int stride;
size_t size;

void CreateIdentity(Matrix<T>&I);
private:
vector<T> elements;
T* firstElement;
};


template<typename T>
Matrix<T>::~Matrix()
{
}

template<typename T>
Matrix<T>::Matrix()
{
}

template<typename T>
Matrix<T>::Matrix(int rows, int columns)
{
height = rows;
width = columns;
stride = columns; //in row major order this is equal to the # of columns
elements.resize(rows*columns);
firstElement = elements.data();
size = height*width*sizeof(T);
}



__global__ void IdentityMatrixKernel(float* identity, int size)
{
int index_x = blockIdx.x * blockDim.x + threadIdx.x;
int index_y = blockIdx.y * blockDim.y + threadIdx.y;

// map the two 2D indices to a single linear, 1D index
int grid_width = gridDim.x * blockDim.x;
int index = index_y * grid_width + index_x;

// map the two 2D block indices to a single linear, 1D block index
//int result = blockIdx.y * gridDim.x + blockIdx.x;

// write out the result

if (index % (size+1))
{
    identity[index] = 0;
}

else
{
    identity[index] = 1;
}
}


template<typename T>
void Matrix<T>::CreateIdentity(Matrix<T>&I)
{
float* d_I;
int size1 = I.height;
int size2 = I.height*I.width*sizeof(float);

cudaMalloc(&d_I,size2);

dim3 block_size;
block_size.x = BLOCKSIZE;
block_size.y = BLOCKSIZE;

dim3 grid_size;
grid_size.x = size1/ block_size.x + 1;
grid_size.y = size1/ block_size.y + 1;

IdentityMatrixKernel<<<block_size,grid_size>>>(d_I,size1);

cudaMemcpy(I.GetPointer(),d_I,size2,cudaMemcpyDeviceToHost);

cudaFree(d_I);
}
#包括
#包括
#包括
#定义块大小32
使用名称空间std;
模板类矩阵
{
公众:
类型定义T值_类型;
~Matrix();
矩阵();
矩阵(int行、int列);
内部高度;
整数宽度;
步幅;
大小;
void CreateIdentity(矩阵&I);
私人:
矢量元素;
T*第一元素;
};
模板
矩阵::~Matrix()
{
}
模板
矩阵::矩阵()
{
}
模板
矩阵::矩阵(int行,int列)
{
高度=行数;
宽度=列;
stride=columns;//按行主顺序,这等于列的#
元素。调整大小(行*列);
firstElement=elements.data();
尺寸=高度*宽度*尺寸(T);
}
__全局_uuu_uu;void identityMatrix内核(浮点*标识,整数大小)
{
int index_x=blockIdx.x*blockDim.x+threadIdx.x;
int index_y=blockIdx.y*blockDim.y+threadIdx.y;
//将两个二维索引映射到单个线性一维索引
int grid_width=gridDim.x*blockDim.x;
int index=索引y*网格宽度+索引x;
//将两个二维块索引映射到单个线性一维块索引
//int result=blockIdx.y*gridDim.x+blockIdx.x;
//写出结果
如果(索引%(大小+1))
{
标识[索引]=0;
}
其他的
{
标识[索引]=1;
}
}
模板
void矩阵::CreateIdentity(矩阵和I)
{
浮动*d_I;
int size1=I.高度;
int size2=I.height*I.width*sizeof(float);
Cudamaloc(和d_I,尺寸2);
dim3块大小;
块大小。x=块大小;
块大小。y=块大小;
dim3网格尺寸;
网格尺寸x=尺寸1/块尺寸x+1;
网格尺寸y=尺寸1/块尺寸y+1;
identityMatrix内核(d_I,大小1);
cudaMemcpy(I.GetPointer(),d_I,size2,cudaMemcpyDeviceToHost);
库达弗里(d_I);
}
这是包含“Matrix.cu”的头文件

元素h

#pragma once
#include "Matrix.cu"
#include <vector>

using namespace std;

class Element
{
public:
Element(void);
~Element(void);
Element(int iD, float k, vector<int> nodes);
Element(int iD, vector<int> nodes, int pId);

void SetElementType(DOF type);
DOF GetElementType();
int GetNodeId(int index);
int GetNodesPerElement();
int GetPartId();

void CalculateShapeFunctions(Matrix<int> spaceCoordinates);
void CalculateSShapeDerivative(Matrix<int> spaceCoordinates);
void CalculateTShapeDerivative(Matrix<int> spaceCoordinates);
Matrix<float> GetShapeFunctions();
float GetSShapeDerivative(int row, int column);
float GetTShapeDerivative(int row, int column);
void SetStrainDisplacement(Matrix<float> B);
Matrix<float> GetStrainDisplacement();

private:

int elementId;
float stiffness;
vector<int> nodeIds;
DOF elementType;
int partId;
Matrix<float> shapeFunctions;
Matrix<float> sShapeDerivative;
Matrix<float> tShapeDerivative;
Matrix<float> strainDisplacement;
};
#pragma一次
#包括“Matrix.cu”
#包括
使用名称空间std;
类元素
{
公众:
元素(无效);
~元素(无效);
元素(int-iD、float k、向量节点);
元素(int-iD、向量节点、int-pId);
void SetElementType(DOF类型);
DOF GetElementType();
int GetNodeId(int索引);
int GetNodesPerElement();
int GetPartId();
计算形状函数(矩阵空间坐标);
void计算形状竞争(矩阵空间坐标);
void calculateShapeDervative(矩阵空间坐标);
矩阵GetShapeFunctions();
float getsShapeDePrivative(int行,int列);
float GetTShapeDerivative(int行,int列);
孔隙位移(矩阵B);
矩阵位移();
私人:
内部元素ID;
浮动刚度;
向量节点;
DOF元素类型;
内部部分;
矩阵形函数;
矩阵S形竞争;
矩阵T形竞争;
基体应变位移;
};
编辑:

因此,我被指示尝试将实现cuda的模板类成员函数分离到一个.cu文件中,同时在原始头文件中保留模板类定义和任何不使用cuda的模板成员函数。这似乎是在正确的路径上,C++编译器编译.h文件,而CUDA编译器则使用.Cu,但是我摆脱链接错误有困难。我知道我需要为.cu文件中需要的类型显式实例化我的模板类,以避免链接错误,但我似乎仍然得到了它们

我在.cu文件末尾实例化了我的模板类,如下所示:

template class Matrix<float>;
template class Matrix<int>;
template class Matrix<string>;
模板类矩阵;
模板类矩阵;
模板类矩阵;

我现在使用CUDA。模板/成员>链接>错误。< > >::Cu文件不能用作包含“文件.Cu”的头文件,因为它们将用C++编译器编译而不是CUDA。解决方案是将实现cuda的任何内容移动到一个单独的.cu文件中,同时仍将模板函数的定义保留在标头中的模板类定义中,并在file.cu中添加一个#include“file.h”。为了解决移动到.cu文件的模板函数声明的任何链接错误,在头文件的底部添加了模板类的显式实例化。由于在使用cuda的模板函数中只使用了float类型,因此只添加了float类型的实例化:模板类矩阵。上述解决方案编译后运行良好

只需删除矩阵类并在其他文件中实现它。C++和CU代码可以调用它而不需要任何问题。不,不可能包含.cut。使用cuda代码将成员函数移动到单独的.cu文件中的问题是,我遇到了链接错误。能否显示链接错误以及如何编译文件等。。展示所有关于你是如何编译你的整个程序的,我能够让它工作。使用cuda的方法不喜欢三种类型的实例化模板类,并且正在退出。不过好消息是,所有使用cuda的方法都只需要浮点类型,当我在.h文件中包含浮点的模板实例化时,程序就生成了。此外,矩阵本身为发送给它的任何类型构造,而不仅仅是浮点型。只有使用cuda的方法被强制使用浮点类型。@user3390212:请添加您的解决方案作为答案。你以后将能够接受这个答案。这将从未回答的问题列表中删除该问题