erenon
erenon

Reputation: 19128

Dynamic struct member damaged while passing to function using CUDA/NVCC

I'm experimenting with CUDA and I ran into a very strange bug. I have the following files (tl;dr, skip them):

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
Contains a class named List, similar to STL list. Becouse of it's length, code omitted, can be foud here: Custom list source

If I compile and run this, I get a segfault. It works as expected, if I issue any of the following changes:

Still doesn't work if I prefix print_graph with __host__.

The segfault occurs becouse the Graph variable doesn't arrive in print_graph. It's list member contains memory trash, so the listing will fail. (I can't pass any other member value)

So my question is: What did I miss? What the hell is going on? Thanks for the read, any help is appreciated.

Upvotes: 1

Views: 306

Answers (1)

talonmies
talonmies

Reputation: 72342

The issue of alignment requirements in structures is discussed in some detail in Chapter 3 of the CUDA programming guide. The short answer is passing -malign-double to nvcc should fix the issue.

Upvotes: 4

Related Questions