我正在試驗CUDA,並遇到一個非常奇怪的錯誤。我有以下文件(TL;博士,跳過它們):動態struct成員傳遞到使用CUDA/NVCC功能時損壞
的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列表。由於它的長度,代碼省略,可以在這裏找到:Custom list source
如果我編譯並運行這個,我會得到一個段錯誤。 它工作正常,如果我發出任何的以下變化:
- 命名printer.cu到printer.cc,所以NVCC是出局。
- 變化foo和bar的定義中
struct Graph
順序(!) - 變化的類型
bar
(如果我改變的foo
類型不工作)
仍然沒有按如果我用__host__
作爲前綴print_graph,那麼t不起作用。
由於Graph變量未到達print_graph,因此發生段錯誤。它是列表成員包含內存垃圾,所以列表將失敗。 (我不能通過任何其他成員值)
所以我的問題是:我錯過了什麼?這到底是怎麼回事?感謝您的閱讀,任何幫助表示讚賞。
檢查您的數據對齊編譯器標誌 - 聽起來像描述中經典的非對齊結構體問題。 – holtavolt 2011-05-14 21:35:55