为什么在C ++ AMP项目的构建过程中出现链接器错误

舍弗勒

我尝试制作一个需要激活器功能的系统。该激活器函数可能具有状态,因此我尝试将状态放入并发:: array_view。当我尝试构建解决方案时,出现以下链接器错误。

错误2错误LNK2019:未解决的外部符号“公共:静态double __thiscall ArtNeuroNet :: ActivationFunctions :: Activator :: function(double,class Concurrency :: array_view)limit(cpu,amp)”(?function @ Activator @ ActivationFunctions @ ArtNeuroNet @ @SENNV?$ array_view @ N $ 00 @ Concurrency @@@ DZ _B)在函数_wmain D:\ Projekte \ ArtNeuroNet \ ArtNeuroNet \ ArtNeuroNet.obj中引用

错误3错误LNK1120:1无法解析的外部D:\ Projekte \ ArtNeuroNet \ Debug \ ArtNeuroNet.exe 1 1 ArtNeuroNet

我的简化激活器看起来像

double Activator::lin_function(double x, concurrency::array_view<double, 1> state)
    restrict(cpu, amp)
{
    if (x > state[StateParameterType::ThresholdParameter])
        return 1;
    else if (x < -(state[StateParameterType::ThresholdParameter]))
        return 0;
    else
        return state[StateParameterType::AlphaParameter] * x + 0.5f;
}

double* Activator::getInitialState(double alpha)
{
    double stateCpu[] = {1.0, 0.5};

    if (alpha != NULL)
        stateCpu[0] = alpha;

    return stateCpu;
}

我的激活器创建看起来像

Activator activator = *(new Activator());
double* stateCpu = activator.getInitialState(1.0);

concurrency::array_view<double, 1> state(2, stateCpu);

activator.lin_function(0.4, state);

为了进行测试,我添加了最后一行,即调用activator.lin_function(0.4,state)如果我对此进行评论,则该项目的构建没有任何问题。

我的问题是,我现在错过了什么或正在做什么,而我本来不应该这样做呢?

编辑

方法lin_function是私有的。但是,在Activator中有一个公共方法函数,该函数调用私有方法lin_function。为了简化起见,我将源代码的这一部分省略了。注释掉对方法lin_function的调用后,这两种方法都是可访问的,否则我将无法构建解决方案。

Activator完全驻留在同一项目中,该项目目前是控制台应用程序。

lin_function依赖于一个状态变量。但是,激活器函数的阈值实现根本不需要任何状态存储。将所有内容更改为阈值激活功能并注释掉其余部分,其反应方式相同。特别是“ lin_function已注释掉->没有链接器错误,否则–>链接器错误”

编辑2

对于激活器,存在头文件(Activator.h)和源文件(Activator.cpp)。似乎链接器无法从声明为strict(cpu,amp)的标头中找到任何方法

// Doesn't get found and throws linker error
double Activator::function(double x)
    restrict(cpu, amp)
{
    return (x >= 0) ? 1 : 0;
}

// Get's found and no linker errors occur
double Activator::function(double x)
{
    return (x >= 0) ? 1 : 0;
}

编辑3

在头文件中将所有包含restrict(amp,cpu)的方法定义为静态后,一切都正确构建并且运行没有问题。

当使用restrict(amp,cpu)时,实际上需要对静态方法进行限制吗?

阿德·米勒(Ade Miller)

这是关于类和函数等方面的C ++ AMP的限制。您还限于支持的C ++类型的子集,但我认为这不是问题。

引用和指针(指向兼容类型)可以在本地使用,但不能由lambda捕获。不允许使用函数指针,指针到指针等。既不是静态变量也不是全局变量。

如果要使用类的实例,则类必须满足更多规则。它们必须没有虚拟功能或虚拟继承。允许使用构造函数,析构函数和其他非虚拟函数。成员变量必须全部为兼容类型,只要这些类满足相同的规则,它们当然可以包括其他类的实例。与amp兼容的功能中的实际代码未在CPU上运行,因此无法执行某些您可能习惯执行的操作:

  • 递归
  • 指针转换
  • 使用虚拟功能
  • 新增或删除
  • RTTI或动态转换
  • 投掷,尝试或抓住
  • 访问全局变量或静态变量
  • 内联汇编器

这是从我的书中摘录的,我对此表示歉意,因为它具有误导性。尚不清楚的是,这适用于您希望作为数据传递给AMP内核的类。不要在类上有restrict(amp)方法的仅静态方法支持此功能,因为无法this与GPU共享类指针,因为它指向CPU上的对象实例。

因此,以下是满足上述要求并可以传递给AMP内核的类的示例:

class stuff
{
public:
    int a;

    stuff(int v) : a(v) { }
};

stuff还满足intAMP支持的受支持类型的要求

以下类stuff在中使用array_view

class test_case
{
public:
    test_case()
    {
    }

    static int amp_method(int a) restrict(amp, cpu)
    {
        return a * a;
    };

    void test_amp()
    {
        concurrency::array_view<stuff, 1> data(100);
        concurrency::parallel_for_each(data.extent, 
            [data](concurrency::index<1> idx) restrict(amp)
        {
            data[idx].a = amp_method(data[idx].a);
        });
        data.synchronize();
    };

    void test_cpu()
    {
        std::vector<int> data(100, 0);
        for (auto& d : data)
        {
            d = amp_method(d);
        }
    }
};

如果删除上的static修饰符,amp_method则在VS 2013上会出现以下错误。

警告C4573:使用“ test_tools_tests :: test_case :: amp_method”需要编译器进行捕获,this但是当前的默认捕获模式不允许它

您可能会在2012年看到一些不同的东西。第一个AMP版本的弱点之一就是它的错误。2013年情况有所改善。

经过反思,这一切似乎真的很合理。this当它引用在CPU上运行的代码时,如何传递给GPU?

请注意,restrict不能将其应用于类。

感谢您强调这个问题。我想我应该更新这本书勘误表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在此过程中出现语法错误

来自分类Dev

为什么在C中出现此段错误?

来自分类Dev

sql server 2014为什么在视图中而不是存储过程中出现代码错误

来自分类Dev

为什么在此示例中出现错误C2797?

来自分类Dev

为什么在以下C程序中出现分段错误

来自分类Dev

为什么在C ++阶乘函数中出现编译错误?

来自分类Dev

为什么数据类型转换错误仅在C ++中出现而不在C中出现?

来自分类Dev

在iOS上构建依赖项时,为什么在“ -reexport_framework”上出现链接器错误?

来自分类Dev

为什么在创建将Webbrowser添加到设计器的wpf项目时,在xmal文件中出现错误?

来自分类Dev

为什么在以下代码中出现“必须是可修改的L值”编译器错误(C2105)?

来自分类Dev

为什么在MongoDB中出现UserNotFound错误?

来自分类Dev

为什么在MongoDB中出现UserNotFound错误?

来自分类Dev

为什么在此脚本中出现错误?

来自分类Dev

为什么在验收测试中出现错误?

来自分类Dev

URL中出现错误为什么?

来自分类Dev

为什么在此C ++代码中出现“访问冲突”

来自分类Dev

在构建过程中什么优先?nuget参考或项目参考

来自分类Dev

在构建过程中什么优先?nuget参考或项目参考

来自分类Dev

C#中的错误括号,为什么?

来自分类Dev

为什么此代码在ANSI C中出现编译错误?

来自分类Dev

为什么在以下函数中出现此错误“ pngrutil.c:27:error:在'='标记之前的预期';',','或')'”?

来自分类Dev

谁能告诉我为什么我在此C代码中出现分段错误?

来自分类Dev

为什么在这个函数 C++ 深度优先搜索中出现运行时错误?

来自分类Dev

更改应用程序主题时,为什么在构建函数中出现错误?

来自分类Dev

为什么会出现错误“ c.getTimezoneOffset不是函数”?

来自分类Dev

C:为什么在free()上会出现错误

来自分类Dev

为什么该指针出现分段错误C?

来自分类Dev

为什么会出现段错误(C ++ 98)?

来自分类Dev

为什么此C程序在此位置出现段错误?

Related 相关文章

  1. 1

    为什么在此过程中出现语法错误

  2. 2

    为什么在C中出现此段错误?

  3. 3

    sql server 2014为什么在视图中而不是存储过程中出现代码错误

  4. 4

    为什么在此示例中出现错误C2797?

  5. 5

    为什么在以下C程序中出现分段错误

  6. 6

    为什么在C ++阶乘函数中出现编译错误?

  7. 7

    为什么数据类型转换错误仅在C ++中出现而不在C中出现?

  8. 8

    在iOS上构建依赖项时,为什么在“ -reexport_framework”上出现链接器错误?

  9. 9

    为什么在创建将Webbrowser添加到设计器的wpf项目时,在xmal文件中出现错误?

  10. 10

    为什么在以下代码中出现“必须是可修改的L值”编译器错误(C2105)?

  11. 11

    为什么在MongoDB中出现UserNotFound错误?

  12. 12

    为什么在MongoDB中出现UserNotFound错误?

  13. 13

    为什么在此脚本中出现错误?

  14. 14

    为什么在验收测试中出现错误?

  15. 15

    URL中出现错误为什么?

  16. 16

    为什么在此C ++代码中出现“访问冲突”

  17. 17

    在构建过程中什么优先?nuget参考或项目参考

  18. 18

    在构建过程中什么优先?nuget参考或项目参考

  19. 19

    C#中的错误括号,为什么?

  20. 20

    为什么此代码在ANSI C中出现编译错误?

  21. 21

    为什么在以下函数中出现此错误“ pngrutil.c:27:error:在'='标记之前的预期';',','或')'”?

  22. 22

    谁能告诉我为什么我在此C代码中出现分段错误?

  23. 23

    为什么在这个函数 C++ 深度优先搜索中出现运行时错误?

  24. 24

    更改应用程序主题时,为什么在构建函数中出现错误?

  25. 25

    为什么会出现错误“ c.getTimezoneOffset不是函数”?

  26. 26

    C:为什么在free()上会出现错误

  27. 27

    为什么该指针出现分段错误C?

  28. 28

    为什么会出现段错误(C ++ 98)?

  29. 29

    为什么此C程序在此位置出现段错误?

热门标签

归档