none
Visual Studio 11中的 amp 中的 restrict 关键字问题,查了好多资料,不甚明确,包括一些MSDN的问题 RRS feed

  • 问题

  • 首先引用MSDN代码段:

    #include <amp.h>
    #include <iostream>
    using namespace concurrency;
    
    void Main() {
        int aCPP[] = {1, 2, 3, 4, 5};
        int bCPP[] = {6, 7, 8, 9, 10};
        int sumCPP[5] = {0, 0, 0, 0, 0};
    
        // Create C++ AMP objects.
        array_view<int, 1> a(5, aCPP);
        array_view<int, 1> b(5, bCPP);
        array_view<int, 1> sum(5, sumCPP);
    
        parallel_for_each(   
            // Define the compute domain, which is the set of threads that are created.
            sum.extent,          
            // Define the code to run on each thread on the accelerator.
            [=](index<1> idx) restrict(amp)
            {
                sum[idx] = a[idx] + b[idx];
            }
        );
    
        // Print the results. The expected output is "7, 9, 11, 13, 15".
        for (int i = 0; i < 5; i++) {
            std::cout << sum[i] << "\n";
        }
    }

    其中 parallel_for_each 报错,然后,我然就了一下,修改成了如下形式:

    #include <iostream>
    #include <amp.h>
    
    using namespace concurrency;
    int main()
    {
    	int aCPP[] = {1, 2, 3, 4, 5};
        int bCPP[] = {6, 7, 8, 9, 10};
        int sumCPP[5] = {0, 0, 0, 0, 0};
    
        // Create C++ AMP objects.
        array_view<int, 1> a(5, aCPP);
        array_view<int, 1> b(5, bCPP);
        array_view<int, 1> sum(5, sumCPP);
    
    	parallel_for_each(sum.grid,[=](index<1> idx) restrict(direct3d)
    	{
    		sum[idx]=a[idx]+b[idx];
    	});
    
    
        // Print the results. The expected output is "7, 9, 11, 13, 15".
        for (int i = 0; i < 5; i++) {
            std::cout << sum[i] << "\n";
        }
    }

    程序可以正确运行,并且得到正确的数据

    我这里问几个小白的问题:

    1. restrict(amp),这是制定编译成amp的形式,但amp并不是一个关键字,我修改成 direct3d,就正确了...有些迷惑,也没有找到准确的东西,有一篇有参考性的文档,但也不是很明白"amp"的具体性质 参考文档:http://blogs.msdn.com/b/nativeconcurrency/archive/2011/09/05/restrict-a-key-new-language-feature-introduced-with-c-amp.aspx

    2. parallel_for_each的问题,sum.grid 和 sum.extent,差距很大啊...msdn不会犯这个错误吧。还是我理解问题?

    我是C++小白一枚,之前是C#程序员,一直做多线程和并行的东西,对线程理解和lambda表达式没有太多问题,可能大部分问题是在语法理解上...

    求解答上面两个问题


    2012年4月15日 13:38

全部回复