使用CUDA / NVCC传递给函数时动态结构成员损坏

时间:2011-05-14 18:29:29

标签: c++ cuda

我正在尝试使用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

如果我编译并运行它,我会得到一个段错误。 按预期工作,如果我发出以下任何更改:

  • 将printer.cu重命名为printer.cc,因此nvcc已不在游戏中。
  • 更改struct Graph(!)
  • 中foo和bar定义的顺序
  • 更改bar的类型(如果我更改foo的类型,则无效)

如果我使用__host__将print_graph作为前缀,那么仍然无效。

由于Graph变量未到达print_graph,因此发生了segfault。它的列表成员包含内存垃圾,因此列表将失败。 (我不能传递任何其他会员价值)

所以我的问题是:我错过了什么?这到底是怎么回事?感谢阅读,感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

CUDA编程指南第3章详细讨论了结构中对齐要求的问题。简短的回答是通过-malign-double到nvcc应该解决问题。