Я экспериментирую с 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. Поскольку его длина, код опущен, можно найти здесь: Источник пользовательского списка
Если я скомпилирую и запущу это, я получу ошибку. Работает как положено, если Я произвожу любое из следующих изменений:
- переименуйте printer.cu в printer.cc, чтобы nvcc вышел из игры.
- изменить порядок определения foo и bar в
struct Graph
(!)
- изменить тип из
bar
(не работает, если я изменю тип foo
)
По-прежнему не работает, если я префикс print_graph с __host__
.
Сегфоут происходит, потому что переменная Graph не появляется в print_graph. Этот элемент списка содержит мусор в памяти, поэтому листинг не удастся. (Я не могу передать другое значение члена)
Итак, мой вопрос: что я пропустил? Что, черт возьми, происходит? Спасибо за прочтение, любая помощь приветствуется.