1

我正在使用 C++AMP 为内部编写一个库,我发现以下内容不起作用,我很好奇为什么(如果我restrict(amp)从仿函数中删除它会起作用):

template <typename T>
using SumType = decltype( std::declval<T>() + std::declval<T>() );

template <typename T, typename Func>
auto TestFunc(T t, Func f) -> SumType<decltype(f(t))>
{
    return f(t) + f(t);
}

int main() {
    auto f = []( float flVal ) restrict(amp) {
         return flVal * flVal;
    };

    float flResult = TestFunc( 1.0f, f ); // Error here: "no instance of function template 'TestFunc' matches the argument list"
}

但是,如果我restrict(amp)从 的定义中删除f,程序将按预期编译。AMP 开放标准中是否有可以阐明这一点的条款?


此外,如果我们在 的定义中使用以下内容,TestFunc即使使用说明符,它也可以正确编译restrict(amp)

template <typename T, typename Func>
auto TestFunc( T t, Func f ) -> T
{
    return f(t) + f(t);
}
4

2 回答 2

1

我相信您想要的是AMP Specification的第 2.2 节。您收到错误“没有函数模板 'TestFunc' 的实例与参数列表匹配”,因为您的调用代码TestFunc不在内部并且 restrict(amp) lambda (作为 a 的一部分parallel_for_each。因此编译器正在寻找带有restrict(cpu)装饰的 TestFunc在上面。

如果您按以下方式更改声明,您的代码是否编译:

    auto f = [](float flVal) restrict(amp, cpu) {
        return flVal * flVal;
    };

在 AMP 上下文之外调用 amp 受限函数/lambdaparallel_for_each有点毫无意义,而且永远不会起作用。即使您可以欺骗编译器不出错。

于 2014-09-04T07:43:58.127 回答
0

restrict关键字告诉编译器只有一个指向该对象的指针。
这允许编译器进行各种优化。

但是,您的 TestFunc 正在按值接收指针函数。所以编译器已经知道你试图通过复制那个指针来欺骗它。

为避免复制,请通过引用传递参数:

template <typename T, typename Func>
auto TestFunc(T t, Func& f) -> SumType<decltype(f(t))>
{
    return f(t) + f(t);
}
于 2014-08-25T07:08:38.430 回答