Динамический член структуры поврежден при передаче в функцию с использованием CUDA / NVCC - PullRequest
1 голос
/ 14 мая 2011

Я экспериментирую с 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. Этот элемент списка содержит мусор в памяти, поэтому листинг не удастся. (Я не могу передать другое значение члена)

Итак, мой вопрос: что я пропустил? Что, черт возьми, происходит? Спасибо за прочтение, любая помощь приветствуется.

1 Ответ

3 голосов
/ 15 мая 2011

Проблема требований к выравниванию в структурах обсуждается более подробно в главе 3 руководства по программированию CUDA. Краткий ответ: -malign-double к nvcc должен исправить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...