Как скомпилировать код CUDA, который использует std::chrono и дату?

#c #datetime #c 14 #chrono

#c #дата-время #c 14 #c -chrono

Вопрос:

Компилятор NVCC отказывается компилировать приведенный ниже код (используя .cu расширение), поскольку он плохо обрабатывает библиотеку даты Говарда Хиннанта. NVCC вызывает GCC 6.4.0. У самого компилятора C нет никаких проблем с этим простым примером. Как я могу это решить?

 #include <iostream>
#include "date.h"

int main()
{
    const auto time = std::chrono::system_clock::now();
    const auto daypoint = date::floor<date::days>(time);
    const auto ymd = date::year_month_day{daypoint};

    std::cout << ymd.year() << std::endl;

    return 0;
}
  
 ../include/date.h:162:27: error: ‘const intmax_t std::__ratio_multiply<std::ratio<24l>, std::ratio<3600l> >::__gcd1’ is private within this context
 using days = std::chrono::duration
                           ^~~~~~~~                                                                                                                                                            
/nfs/admin/hpc/sw/RedHatEnterpriseServer7/GCCcore/6.4.0/include/c  /6.4.0/ratio:289:32: note: declared private here
       static const intmax_t __gcd1 =
                                ^~~~~ 
  

Комментарии:

1. Последняя версия библиотеки (v3.0.0) должна успешно скомпилироваться с NVCC github.com/HowardHinnant/date/pull/510

Ответ №1:

Единственное, что я могу порекомендовать, это отправить отчет об ошибке в Nvidia. Вот сокращенный тестовый пример:

 #include <chrono>
#include <ratio>

using days = std::chrono::duration
    <int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;

int main() {}
  

Комментарии:

1. Спасибо, если это ошибка, то мой вопрос на самом деле не относится к SO. Извините, что обвиняю вашу библиотеку!

2. Не проблема. Я рад помочь разобраться в этом. Поскольку у меня нет доступа к компилятору NVCC, можете ли вы подтвердить, что мой сокращенный тестовый пример не работает с компилятором NVCC?

3. Я подтверждаю это. Это тоже не компилируется: en.cppreference.com/w/cpp/numeric/ratio/ratio_multiply кажется, что ratio_multiply это источник ошибки.

4. Привет @HowardHinnant, я столкнулся с той же проблемой и смог обойти это, просто заменив экземпляры std::ratio_multiply и std::ratio_divide явными значениями в date/date.h заголовочном файле. Мне интересно, были бы вы заинтересованы в объединении, если бы я создал PR для этого обходного пути (я полностью понимаю, если ответ отрицательный, это проблема cuda, а не проблема с библиотекой дат, но было бы неплохо, чтобы библиотека работала «из коробки»)?

5. Работает ли добавление ::type к закрывающей угловой скобке ratio_multiply ? using days = std::chrono::duration <int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>::type>;