Rcpp не компилируется с Intel MIC - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь заставить этот минимальный прагматический код Rcpp / Intel работать, однако сталкиваюсь с некоторыми довольно большими ошибками, которые я изо всех сил пытаюсь преодолеть.

Код

Это полный код, который я пытаюсь запустить - это простой текстовый текст, показывающий, задействовано ли целевое устройство Xeon Phi согласно данному сайту: Выгрузка вычислений с серверов с процессором Intel® Xeon Phi ™ , и это основано на примере кода, найденного здесь: Алгоритмы машинного обучения Lightning-Fast R :

library(Rcpp)
library(inline)
# Create and register a Rcpp plugin
plug <- Rcpp:::Rcpp.plugin.maker(
  include.before = "#include <stdint.h>
#include <stdio.h>
#include <omp.h>"
)
registerPlugin("daalNB", plug)

whatCPU <- 
'
#pragma omp declare target
void what_cpu()
{
  uint32_t eax;
  const uint32_t xeon_phi_x100_id = 0x00010;
  const uint32_t xeon_phi_x200_id = 0x50070;

  __asm volatile("cpuid":"=a"(eax):"a"(1));

  uint32_t this_cpu_id =  eax & 0xF00F0;

  if (this_cpu_id == xeon_phi_x100_id)
    printf("This CPU is Intel(R) XeonPhi(TM) x100 Processor!");
  else
    if (this_cpu_id == xeon_phi_x200_id)
      printf("This CPU is Intel(R) XeonPhi(TM) x200 Processor!");
    else
      printf("This CPU is other Intel(R) Processor.");
}
'

offloadExampleRcpp <- 
'
//[[Rcpp::plugins(openmp)]]
  printf("Running on host: ");
  what_cpu();

#pragma offload target(mic:0)
{
  printf("Running on target: ");
  what_cpu();
}
'

runOffloadExample <- cxxfunction(sig = signature(), body = offloadExampleRcpp, plugin="daalNB", includes = '
//[[Rcpp::plugins(openmp)]]
#pragma omp declare target
void what_cpu()
{
  uint32_t eax;
  const uint32_t xeon_phi_x100_id = 0x225d;
  const uint32_t xeon_phi_x200_id = 0x50070;

  __asm volatile("cpuid":"=a"(eax):"a"(1));

  uint32_t this_cpu_id =  eax & 0xF00F0;

  if (this_cpu_id == xeon_phi_x100_id)
    printf("This CPU is Intel(R) XeonPhi(TM) x100 Processor!");
  else
    if (this_cpu_id == xeon_phi_x200_id)
      printf("This CPU is Intel(R) XeonPhi(TM) x200 Processor!");
    else
      printf("This CPU is other Intel(R) Processor.");

}
', verbose = 2)

runOffloadExample() 

Что я пробовал и ошибки:

Я правильно настроил программный стек Xeon Phi, и это можно подтвердить, когда я компилирую код .c (который находится внутри Rcpp в вышеприведенном коде) вне R, используя IntelICC-компилятор, это успешно;а именно, я могу получить точный вывод, как показано на сайте Intel процессор.

Однако кажется, что когда тот же код .c обернут внутри Rcpp, возникают следующие ошибки, которыепредотвратить компиляцию (это образец из гораздо более длинного показания):

Compilation argument:
 /usr/local/lib64/R/bin/R CMD SHLIB file306737f15222.cpp 2> file306737f15222.cpp.err.txt 
/opt/intel/compilers_and_libraries_2017.1.132/linux/bin/intel64/icc -I/usr/local/lib64/R/include -DNDEBUG  -I"/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include" -I/usr/local/include   -fpic  -qopenmp -c file306737f15222.cpp -o file306737f15222.o
file306737f15222.cpp(52): warning #2571: variable has not been declared with compatible "target" attribute
  BEGIN_RCPP
  ^

file306737f15222.cpp(63): warning #2570: function has not been declared with compatible "target" attribute
  END_RCPP
  ^

file306737f15222.cpp(63): warning #2570: function has not been declared with compatible "target" attribute
  END_RCPP
  ^

Кроме того , за указанным выше показанием ошибки следуют тонны и тонны из приведенных ниже ошибок (опять же, у меня есть толькодля краткости включил образец, однако я считаю, что все другие ошибки связаны с той же проблемой, что и в моем вопросе):

/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/protection/Shelter.h(34): warning #2570: function has not been declared with compatible "target" attribute
              Rcpp_unprotect(nprotected) ;
              ^
          detected during:
            instantiation of "Rcpp::Shelter<T>::~Shelter() [with T=SEXP]" at line 323 of "/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/exceptions.h"
            instantiation of "SEXP exception_to_condition_template(const Exception &, bool) [with Exception=Rcpp::exception]" at line 339 of "/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/exceptions.h"

/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/protection/Shelter.h(30): warning #2570: function has not been declared with compatible "target" attribute
              return Rcpp_protect(x) ;
                     ^
          detected during:
            instantiation of "SEXP Rcpp::Shelter<T>::operator()(SEXP) [with T=SEXP]" at line 326 of "/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/exceptions.h"
            instantiation of "SEXP exception_to_condition_template(const Exception &, bool) [with Exception=Rcpp::exception]" at line 339 of "/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/exceptions.h"

/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/utils/tinyformat/tinyformat.h(218): warning #2570: function has not been declared with compatible "target" attribute
      static void invoke(std::ostream& /*out*/, const T& /*value*/) { TINYFORMAT_ASSERT(0); }
                                                                      ^
          detected during:
            instantiation of "void tinyformat::detail::formatValueAsType<T, fmtT, convertible>::invoke(std::ostream &, const T &) [with T=const char *, fmtT=char, convertible=false]" at line 329
            instantiation of "void tinyformat::formatValue(std::ostream &, const char *, const char *, int, const T &) [with T=const char *]" at line 528
            instantiation of "void tinyformat::detail::FormatArg::formatImpl<T>(std::ostream &, const char *, const char *, int, const void *) [with T=const char *]" at line 504
            instantiation of "tinyformat::detail::FormatArg::FormatArg(const T &) [with T=const char *]" at line 881
            instantiation of "tinyformat::detail::FormatListN<N>::FormatListN(const Args &...) [with N=1, Args=<const char *>]" at line 930
            instantiation of "tinyformat::detail::FormatListN<<expression>> tinyformat::makeFormatList(const Args &...) [with Args=<const char *>]" at line 966
            instantiation of "void tinyformat::format(std::ostream &, const char *, const Args &...) [with Args=<const char *>]" at line 975
            instantiation of "std::string tinyformat::format(const char *, const Args &...) [with Args=<const char *>]" at line 226 of "/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/exceptions.h"
            instantiation of "Rcpp::not_compatible::not_compatible(const char *, Args &&...) [with Args=<const char *const &>]" at line 37 of "/home/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/r_cast.h"

Интересно, кто-нибудь может помочь мне указать, какие проблемыв результате вышеперечисленных ошибок?Я осознаю, что могу упустить что-то фундаментальное из-за моего знакомства с C и пакетом Rcpp, поэтому прошу прощения за это.

Заранее большое спасибо,

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