2011-05-14 32 views
1

我正在試驗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,因此發生段錯誤。它是列表成員包含內存垃圾,所以列表將失敗。 (我不能通過任何其他成員值)

所以我的問題是:我錯過了什麼?這到底是怎麼回事?感謝您的閱讀,任何幫助表示讚賞。

+1

檢查您的數據對齊編譯器標誌 - 聽起來像描述中經典的非對齊結構體問題。 – holtavolt 2011-05-14 21:35:55

回答

3

CUDA編程指南第3章詳細討論了結構中對齊需求的問題。簡短的答案是傳遞-malign-double給nvcc應該解決問題。

+0

感謝您的輸入。事實證明,我必須在編譯main.cpp時將-malign-double傳遞給g ++,nvcc會自動傳遞它。 – erenon 2011-05-15 12:54:15