这个问题注定要重复,直到所有具体情况都用尽为止。但这一次确实令人困惑,因为解决“#includes”通常不是问题。
状况
IDE:Nsight
CUDA VARSION:CUDA-9.0
GPU可计算性:3.7
程序结构
main.cu
|
#include GPU_in_grig.cuh - defines class and C-structures with serialization functions
| - #includes <cereal/archives/binary.hpp>
#include NN_def.cuh - defines C-structure, also with serialization functions
- #includes <cereal/archives/binary.hpp> <- ERROR
错误
14:14:19 ** Incremental Build of configuration Debug for project cuda_managed_v0_2 **
make all
Building file: ../source_code/main.cu
Invoking: NVCC Compiler
/usr/local/cuda-9.0/bin/nvcc -I"/home/mgaraj/cuda-workspace/cuda_managed_v0_2/source_code/cereal" -G -g -O0 -std=c++11 -gencode arch=compute_37,code=sm_37 -odir "source_code" -M -o "source_code/main.d" "../source_code/main.cu"
In file included from ../source_code/GPU_in_grid.cuh:15:0,
from ../source_code/main.cu:9:
../source_code/NN_def.hpp:18:38: fatal error: cereal/archives/binary.hpp: No such file or directory
compilation terminated.
make: * [source_code/main.o] Error 1
source_code/subdir.mk:21: recipe for target 'source_code/main.o' failed
14:14:19 Build Finished (took 172ms)
Cereal Cereal
对于不熟悉 Cereal 库的人们,这是仅 header 的库,只需将其复制粘贴到我的项目中,并将其复制到所有代码所在的文件夹source_code中。
上面显示了有问题的文件,导致编译错误。请注意,该文件位于source_code/cereal/archives中,该文件位于-cereal/archives/binary.hpp-中,原因是错误提示。
我的代码
#ifndef NN_DEF_H_
#define NN_DEF_H_
//==========================================================//
// INCLUDES //
//==========================================================//
// std::cout
#include <iostream>
// Cereal - serialization
#include <cereal/archives/binary.hpp>
#include <cereal/archives/portable_binary.hpp>
//==========================================================//
// PARAMETERS //
//==========================================================//
// OMITTED
//==========================================================//
// CLASS DEFINITION //
//==========================================================//
class NN{
public:
bool check_limits(void);
void print(void);
public:
//==========================//
// CONTENT //
//==========================//
float weight[NN_layer][NN_neuron][NN_weight];
// ensure the size of NN_layout equals the NN_layer parameter
int layout[NN_layer] = NN_layout;
// debugging parameter
int debug;
//==========================//
// SERIALIZATION //
//==========================//
// function required by cereal library
template<class Archive>
void serialize(Archive & ar){
ar( cereal::binary_data( weight , sizeof(float) * NN_layer * NN_neuron * NN_weight));
ar( cereal::binary_data( layout , sizeof(float) * NN_layer) );
ar( debug );
}
};
//==========================================================//
// FUNCTION DEFINITION //
//==========================================================//
bool NN::check_limits(void){
// OMITTED
};
void NN::print(void){
// OMITTED
}
#endif /* NN_DEF_H_ */
我为解决错误而采取的措施
问题
为什么错误如此持久? NVCC编译器是否会引起问题?与我的代码有关吗?
最佳答案
NVCC(或只是编译器)带有-I选项“/source_code/cereal”时,无法理解与#include“cereal/archives/binary.hpp”的重叠。重叠的是两个路径中都包含的“cereal/”目录。
简单地让编译器知道-I =“/source_code”,就可以解决问题,因为#include“cereal/archives/binary.hpp”随后被附加到-I选项,因此导致了“source_code/cereal/archives/binary .hpp”路径。