zoukankan      html  css  js  c++  java
  • 8.2 C++ AMP advanced concepts

    C++ AMP一些更高级的概念:

    1. device内存的分配和拷贝.

    void vecAdd(float* A, float* B, float* C, int n)
    {
      array<float,1> AA(n), BA(n);
      array<float,1> CA(n);
      copy(A,AA);
      copy(B,BA);
      parallel_for_each(CA.get_extent(),
      [&AA,&BA,&CA](index<1> i) restrict(amp)
      {
        CA[i] = AA[i] + BA[i];
      });
      copy(CA,C);
    }

    array<T,Dimesion>的作用是分配 Accelerator memory,类似于cudaMalloc().

    copy(source,destination)的作用是拷贝内存动作,可以在host和Accelerator之间来回拷贝,类似于cudaMemcpy().

    这两者加起来的功能就是array_view<>.

    另外注意到执行完kernel计算后,拷贝CA数据回host C, 但是并没有执行CV.synchronize()动作,其实copy有隐式同步的功能.

    2. host和accelerator异步执行

    上面的代码host和accelerator的执行顺序如下图:(左边的是host,右边的是accelerator)

    accelerator设备在执行compute的时候,host可以同时执行其他的动作,比如下面的代码:

      parallel_for_each(CA.get_extent(),
      [&AA,&BA,&CA](index<1> i) restrict(amp)
      {
        CA[i] = AA[i] + BA[i];
      });
      completion_future done = CV.synchronize_async();
      otherProcessing(A,B);
      done.get();

    completion_future done关联CV的操作. done.get()等待,直到关联的异步操作完成为止.

    这个代码的执行顺序图如下:

    可以看到,在accelerator执行计算的时候,cpu在执行otherProcessing().

     

     

  • 相关阅读:
    Mysql自定义函数总结
    MySQL的基本函数
    Mysql存储过程总结
    Mysql触发器总结
    Mysql索引总结(二)
    Mysql索引总结(一)
    Mysql游标使用
    别人的博客,留待后看
    mysql外键约束总结
    mysql视图总结
  • 原文地址:https://www.cnblogs.com/biglucky/p/4363552.html
Copyright © 2011-2022 走看看