你能在c++头文件中包含.cu扩展头文件吗?
Can you include a .cu extension header in a c++ header?
我有一个.cu文件,当自己编译时,右键单击并选择编译,它编译得很好,但是当我有另一个头文件,一个c++头文件,调用这个.cu文件构建失败。.cu文件属性已被编辑为使用CUDA编译器构建。我得到的错误是'blockIdx':未声明的标识符'blockDim':未声明的标识符等。基本上是我期望用c++编译器编译cuda代码的错误。那么,在c++头文件中包含.cu cuda代码是可能的吗?
.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);
}
这里是头文件#include "Matrix.cu"
Element.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;
};
编辑:所以我已经被指示尝试和分离模板类成员函数实现cuda到一个.cu文件,同时保持模板类定义和任何模板成员函数不使用cuda在原始头文件。这似乎在正确的路径上,c++编译器编译。h文件,而cuda编译器做。cu,但我有麻烦摆脱链接错误。我明白,我需要显式地实例化我的模板类的类型,我需要在.cu文件中避免链接错误,但我似乎仍然得到他们。
我在.cu文件的末尾实例化了模板类,如下所示:
template class Matrix<float>;
template class Matrix<int>;
template class Matrix<string>;
我现在得到链接错误的模板成员函数使用cuda。
答案:.cu文件不能作为#include "文件使用。因为它们是用c++编译器编译的,而不是cuda。解决方案是将任何实现cuda的东西移动到一个单独的。cu文件中,同时仍然保持模板函数的定义在头文件中的模板类定义中,并在file.cu中添加一个#include "file.h"。为了解决移动到.cu文件中的模板函数声明的链接错误,在头文件的底部添加了模板类的显式实例化。由于使用cuda的模板函数中只使用float类型,因此只添加了float类型的实例化:模板类Matrix。上面的解决方案编译和运行都很完美。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- 现代CMake(3.8+)-FindCUDA已弃用,非.cu文件呢
- 生成一个使用 boost 的 .cu 文件
- 如何将数据类型声明从.cpp文件传输到 .cu 文件
- 为什么 CUDA .cu 文件中会出现多个定义错误
- CUDA C++:文件中 kernel.cu 应有一个表达式
- mexcuda在.cu文件中的delete[]()处具有断点
- 包含多个 .h 和 .cu 文件的静态库无法解析函数
- .cpp+.cu文件的CMake文件
- CMake + Cuda:在 Cuda-mode (--x=cu) 下编译 cpp 文件
- CUDA 和 C++,如何链接 cpp 和 cu 文件
- CUDA C-无法编译在头文件中声明并在.cu中实现的类
- 如何在多个.cpp和.cu文件之间分割类定义
- 从c++类中调用.cu文件中的内联函数
- Visual studio .cu文件显示语法错误,但编译成功
- 有效的cuda文件组织方式:.cpp .h .cu .cuh .curnel文件
- R CMD 检查警告与 CUDA *.cu 文件
- 你能在c++头文件中包含.cu扩展头文件吗?