我正在尝试使用CUDA,我遇到了一个非常奇怪的错误。我有以下文件(tl; dr,跳过它们):
的main.cpp
#include "main.h"
#include "list.hpp"
void print_graph(Graph& g);
void init(Graph& g) {
g.list = new List<int>;
for (int j = 0; j < 5; j++) {
g.list->push_back(j+1);
}
}
int main()
{
Graph g;
init(g);
print_graph(g);
delete g.list;
}
main.h
#include "list.hpp"
#ifndef _MAIN_H_
#define _MAIN_H_
struct Graph {
int foo;
double bar;
List<int> *list;
};
#endif
printer.cu
#include "main.h"
#include "list.hpp"
#include <cstdio>
void print_graph(Graph& g) {
List<int>::iterator it;
for (it = g.list->begin(); it != g.list->end(); it++) {
printf("%d\t", *it);
}
printf("\n\n");
}
list.hpp
包含一个名为List的类,类似于STL列表。它的长度,代码省略,可以在这里foud:Custom list source
如果我编译并运行它,我会得到一个段错误。 按预期工作,如果我发出以下任何更改:
struct Graph
(!)bar
的类型(如果我更改foo
的类型,则无效)如果我使用__host__
将print_graph作为前缀,那么仍然无效。
由于Graph变量未到达print_graph,因此发生了segfault。它的列表成员包含内存垃圾,因此列表将失败。 (我不能传递任何其他会员价值)
所以我的问题是:我错过了什么?这到底是怎么回事?感谢阅读,感谢任何帮助。
答案 0 :(得分:3)
CUDA编程指南第3章详细讨论了结构中对齐要求的问题。简短的回答是通过-malign-double到nvcc应该解决问题。