Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用_Cilk_offload进行卸载希望每个功能都被_Cilk_共享?_C++_Parallel Processing_Xeon Phi_Cilk Plus_Offloading - Fatal编程技术网

C++ 为什么使用_Cilk_offload进行卸载希望每个功能都被_Cilk_共享?

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。再运行一次。这次麦克风给出了正确的结果 我还检查了这些函

我已经声明了一些要共享的全局变量。它们用于我想要卸载的功能,它们用于一些我不想卸载的功能

因此,最初我只将需要卸载的函数声明为_Cilk_共享,并使用_Cilk_卸载调用这些函数

它编译得很好。当我只在主机上运行它时,它会给出正确的结果

然后我用麦克风运行它。它给了我一个运行时错误,关于无法加载库bla未定义的符号,后跟我没有声明为_cilk_shared的函数名。这些功能也不需要共享

因此,我必须将这些函数更改为_cilk_shared。再运行一次。这次麦克风给出了正确的结果

我还检查了这些函数(我不想卸载,最初也没有声明为_cilk_shared)是否通过使用

#ifdef __MIC__
    printf(" Running on MIC\n");
#else
    printf("No MIC\n");
#endif
结果是它们没有被卸载


所以我想知道为什么它要我声明这些函数是共享的

当函数被声明为卸载时- 如果函数在该文件中定义,编译器将生成 将在处理器上运行的目标代码和将 在协处理器上运行。 如果该函数在该文件中使用,则 生成将调用处理器版本和代码的目标代码 这将调用协处理器版本(除非调用在 受“ifdef MIC”保护的区域

那么,为什么即使您从未在卸载区域调用函数,加载程序仍希望函数已声明为卸载呢? 如果函数是一个类的一部分,那么整个类需要声明为卸载,因为类“知道”什么函数是它的一部分。当你加载一个类的对象代码时,你加载整个类。在这种情况下,如果你要共享该类的对象,它应该声明为_Cilk_shared

如果函数在动态链接库中,您可能会遇到类似的问题。动态链接库“知道”哪些函数是它的一部分,它“知道”它需要哪些函数。因此,当您运行代码时,加载程序希望找到库“知道”它需要的所有文件。在这种情况下,最简单的方法是使用JU不要制作所有库的卸载版本。其他可以尝试的事情-尝试静态链接包含这些文件的库,或者尝试创建“不知道”它们需要它们真正不需要的库-将库拆分为多个部分,或者尝试显式创建单独的主机和协处理器版本的库,就像您为co所做的那样de您将在协处理器上以本机方式运行


如果这不能解释您看到的情况,请告诉我。

我编写的函数都不是动态链接的,也不是共享类中的成员函数。它们只是在头文件中声明。唉,您是否可以编写一个显示此行为的小测试用例?看起来可能需要进一步挖掘才能弄清楚。