C++ 为什么使用_Cilk_offload进行卸载希望每个功能都被_Cilk_共享?
我已经声明了一些要共享的全局变量。它们用于我想要卸载的功能,它们用于一些我不想卸载的功能 因此,最初我只将需要卸载的函数声明为_Cilk_共享,并使用_Cilk_卸载调用这些函数 它编译得很好。当我只在主机上运行它时,它会给出正确的结果 然后我用麦克风运行它。它给了我一个运行时错误,关于无法加载库bla未定义的符号,后跟我没有声明为_cilk_shared的函数名。这些功能也不需要共享 因此,我必须将这些函数更改为_cilk_shared。再运行一次。这次麦克风给出了正确的结果 我还检查了这些函数(我不想卸载,最初也没有声明为_cilk_shared)是否通过使用C++ 为什么使用_Cilk_offload进行卸载希望每个功能都被_Cilk_共享?,c++,parallel-processing,xeon-phi,cilk-plus,offloading,C++,Parallel Processing,Xeon Phi,Cilk Plus,Offloading,我已经声明了一些要共享的全局变量。它们用于我想要卸载的功能,它们用于一些我不想卸载的功能 因此,最初我只将需要卸载的函数声明为_Cilk_共享,并使用_Cilk_卸载调用这些函数 它编译得很好。当我只在主机上运行它时,它会给出正确的结果 然后我用麦克风运行它。它给了我一个运行时错误,关于无法加载库bla未定义的符号,后跟我没有声明为_cilk_shared的函数名。这些功能也不需要共享 因此,我必须将这些函数更改为_cilk_shared。再运行一次。这次麦克风给出了正确的结果 我还检查了这些函
#ifdef __MIC__
printf(" Running on MIC\n");
#else
printf("No MIC\n");
#endif
结果是它们没有被卸载
所以我想知道为什么它要我声明这些函数是共享的 当函数被声明为卸载时- 如果函数在该文件中定义,编译器将生成 将在处理器上运行的目标代码和将 在协处理器上运行。 如果该函数在该文件中使用,则 生成将调用处理器版本和代码的目标代码 这将调用协处理器版本(除非调用在 受“ifdef MIC”保护的区域 那么,为什么即使您从未在卸载区域调用函数,加载程序仍希望函数已声明为卸载呢? 如果函数是一个类的一部分,那么整个类需要声明为卸载,因为类“知道”什么函数是它的一部分。当你加载一个类的对象代码时,你加载整个类。在这种情况下,如果你要共享该类的对象,它应该声明为_Cilk_shared 如果函数在动态链接库中,您可能会遇到类似的问题。动态链接库“知道”哪些函数是它的一部分,它“知道”它需要哪些函数。因此,当您运行代码时,加载程序希望找到库“知道”它需要的所有文件。在这种情况下,最简单的方法是使用JU不要制作所有库的卸载版本。其他可以尝试的事情-尝试静态链接包含这些文件的库,或者尝试创建“不知道”它们需要它们真正不需要的库-将库拆分为多个部分,或者尝试显式创建单独的主机和协处理器版本的库,就像您为co所做的那样de您将在协处理器上以本机方式运行
如果这不能解释您看到的情况,请告诉我。我编写的函数都不是动态链接的,也不是共享类中的成员函数。它们只是在头文件中声明。唉,您是否可以编写一个显示此行为的小测试用例?看起来可能需要进一步挖掘才能弄清楚。