2016-07-20 4 views
-2

Моя программа должна вычислить ограничивающий прямоугольник от вектора граничными объектами, а min/max 3d-векторы этого ограничивающего прямоугольника должны использоваться в ядре CUDA.C/C++ - printf действующий weird

Для этого я получить мою ограничительную рамку в с рутиной ++ (systemparticlesph.cpp):

void SystemParticleSPH::computeNeighborhood() 
{ 
    //cellSize 
    UniformGridParameters grid_params; 
    grid_params.cellSize = sph_parameters.ParticleRadius; 

    //bbox 
    std::pair<glm::vec3, glm::vec3> bbox = CollisionObjectsContainer::getInstance()->getBBox(); 
    grid_params.min = std::get<0>(bbox); 
    grid_params.max = std::get<1>(bbox); 

    //works fine here ! 
    std::cout << "cpp cellSize " << grid_params.cellSize << std::endl; 
    std::cout << "cpp min " << grid_params.min.x << " " << grid_params.min.y << " " << grid_params.min.z << std::endl; 
    std::cout << "cpp max " << grid_params.max.x << " " << grid_params.max.y << " " << grid_params.max.z << std::endl; 

    //cuda call 
    computeNeighborsCuda(grid_params); 
} 

Результатов отпечатанных соиЬ именно то, что я ожидал в соответствии с граничными объектами, которые я создал:

cpp cellSize 0.02 
cpp min -0.25 -0.25 -0.25 
cpp max 0.25 0.25 0.25 

Я действительно трудное время, когда я пытаюсь напечатать те же точные данные в функции computeNeighborsCuda(grid_params);, расположенной в systemparticlessph.cu:

отображается

Результаты (когда я комментарий 3 cout) должны быть одинаковыми, но вот что я получаю:

cellsize -0,25 min -0,25 -0,25 0,25 max 0,25 0,25 -7168,19

Похоже, есть некоторое смещение делая все это неправильно: cellSize имеет значение min.x, а max.z имеет произвольное значение.

Обратите внимание, что проблема такая же, когда я вызываю printf из ядра CUDA.

отметить также, что она становится все хуже, когда я отображать как с соиЬ и Printf в то же время:

cpp cellSize 0.02 
cpp min -0.25 -0.25 -0.25 
cpp max 0.25 0.25 0.25 
cellsize -1,79826e+36 min 0 1,21731e-37 0 max 1,21731e-37 0 1,21731e-37 

У вас есть представление о том, чтобы получить тот же результат в функции C (и ядро) ?

Заранее спасибо, это действительно смущает меня.

Mathias

Edit:

Передача ссылки вместо копии структуры, все работает прекрасно.

Тем не менее, я понятия не имею, почему это не работает с копией структуры.

+2

'C/C++' это UB .. –

+0

Что означает UB? –

+0

Попробуйте заменить% g на% f. – OrMiz

ответ

-1

Я бы предложил создать собственную структуру с простыми переменными и скопировать точные данные, которые вы хотите показать из программы C++, в функцию CUDA.

Смежные вопросы