问题标签 [c++-amp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何同时在 CPU 和 GPU 设备上运行任务?
我的这段代码是经过分析、优化和缓存高效的,因为我可能会根据我的知识水平得到它。它在概念上像这样在 CPU 上运行:
碰巧它RunTask()
本质上是一组线性代数运算,每次都在同一个非常大的数据集上重复运行,因此它适合在 GPU 上运行。所以我想实现以下目标:
- 将一些任务卸载到 GPU
- 在 GPU 忙碌时,处理 CPU 上的其余任务
- 对于 CPU 级别的操作,保留我的 super-duper
RunTask()
功能,而无需修改它以符合restrict(amp)
. 我当然可以restrict(amp)
为 GPU 任务设计一个兼容的 lambda。
最初我想这样做:
但我怀疑你可以做这样的事情,因为
对 parallel_for_each 的调用表现得好像它是同步的
( http://msdn.microsoft.com/en-us/library/hh305254.aspx )
那么是否有可能实现我的 1-3 个请求,还是我必须放弃第 3 个请求?即便如此,我将如何实现它?
c++ - “最大”和“最小”重要维度是什么意思?
我正在读一本关于 C++ AMP 的书,但并不真正理解一些术语:
始终选择您的 tile 大小,以便最低有效维度中的线程数至少为 16,如果可以,请使用 32 甚至 64。
我在 Eigen 文档中看到过类似的术语,所以我怀疑这是很常见的用法。
所以让我们假设我有一个 2D 索引,数组,无论如何:
暂时忘记 的类型,ArrayType
并更多地考虑术语,哪个是该数组的最重要和最不重要的维度?
c++ - 我可以将多少内存声明为 tile_static?
我目前正在平铺我的 c++ AMP 代码。对于每个图块,我有 4096 字节的数据经常被读取,所以我想将其声明为 tile_static。将其分成多个图块是不切实际的,因为每个线程都需要访问所有数据。我的瓦片由 128 个线程组成,因此它们应该在 Nvidia/AMD GPU 上占用 2-4 个扭曲。
我刚刚阅读了以下文章,这似乎表明我只能在每个 warp 的 tile_static 中使用 1024 位:http: //blogs.msdn.com/b/nativeconcurrency/archive/2012/08/14/avoid-bank-conflicts -on-tile-static-memory-with-c-amp.aspx
在一些现代 GPU 上,tile_static 内存由可以同时访问的“n”个大小相等的内存条组成,并且连续的“m”位字被映射到连续的内存条。tile_static 内存(即 n 和 m)的确切组织取决于硬件。例如,在 Nvidia GTX 580 卡或 ATI HD 5870 卡上,tile_static 内存具有32 个存储库 (n = 32),这些存储库的组织方式使得连续的 32 位字 (m = 32) 映射到连续的存储库。请注意,n 可能因硬件而异,m 通常为 32。在本文的其余部分,我将假设 m 为 32。
这是否意味着我可以为每个扭曲或每个线程声明多达 1024 位?所有 tile_static 变量是否在 warp 之间共享,或者每个 warp 都有自己的副本?
这些问题中有多少是依赖于硬件的,如果是,我怎样才能在运行时找出限制?
我已经阅读了一本 c++ AMP 书籍封面,虽然我很感谢作者向我介绍了这个主题,但它似乎没有解决这个问题(或者如果它解决了,我不明白它)。
网上有很多关于如何使用 tile_static 内存的信息(这是一个好的开始:http ://www.danielmoth.com/Blog/tilestatic-Tilebarrier-And-Tiled-Matrix-Multiplication-With-C-AMP .aspx),但似乎没有人谈论我们可以声明多少,因此不可能真正实现这些东西!最后一个链接给出了以下示例:
请注意,第 13 行声明了 2x 1024 位,这让我希望我的 4096 位不会要求太多...... - 我想这些问题更多地依赖于硬件/实现,而不是 AMP 语言扩展本身......
c++ - tile_static 动态索引数组;我应该打扰吗?
我将竭尽全力尝试将经常访问的数据存储在tile_static
内存中,以利用随之而来的无限性能必杀技。
但是,我刚刚读到只有某些硬件/驱动程序实际上可以动态索引 tile_static 数组,并且该操作无论如何都可能溢出到全局内存。
在一个理想的世界里,我只是做它并配置文件,但事实证明这是一项重大操作,我想知道我是否在这里浪费时间:
如何确定我的 GPU/驱动程序是否支持静态数组的动态索引?
c++ - array_view.synchronize_asynch 会等待 parallel_for_each 完成吗?
如果我concurrency::array_view
在一个concurrency::parallel_for_each
循环中被操作,我的理解是我可以在循环执行时继续 CPU 上的其他任务:
但是,如果我不想等待并行 for 循环,而是尽快开始从 GPU 复制数据回来怎么办。下面的工作吗?
我在The Moth上阅读了有关此主题的信息,但在阅读了以下内容后,我并没有真正变得更聪明:
请注意,parallel_for_each 的执行好像与调用代码同步,但实际上它是异步的。即一旦调用了parallel_for_each 并且内核已经被传递到运行时,some_code_B 区域继续由CPU 线程立即执行,而并行内核由GPU 线程执行。但是,如果您尝试访问您在 some_code_B 区域的 lambda 中捕获的(数组或数组视图)数据,您的代码将阻塞,直到结果可用。因此正确的说法是:parallel_for_each 在可见的副作用方面似乎是同步的,但实际上是异步的。
c++-amp - 如果我需要一个大小为零的数组,我该怎么办?
假设我有一个Concurrency::array
我只在运行时知道的大小,并且该大小可能为零:
在主机上,这个问题是微不足道的;您只需声明一个大小为零的向量,任何基于范围的循环都会忽略它。在 C++ AMP 中,您必须为每个可能为 null 大小的数组设计一个单独的内核函数……当然有更好的方法,为什么我们一开始就不能只使用零大小的数组?
程序员如何避免此类问题?
我目前正在通过执行以下操作来避免它,对此我并不感到自豪:
c++ - 如何获取 Concurrency::completion_future 的状态?
我刚读到这个:
由于Concurrency::completion_future
似乎模仿的功能std::future
我认为我可以做类似的事情,但这个相对简单的例子失败了:
为什么这个断言会失败?
c++ - 我可以运行一个存储的 lambda,其捕获的值不再在范围内吗?
我有一个未来,我想将一个 lambda 传递给它以在它完成时运行,但是在 lambda 执行时范围会发生变化;捕获的值会发生什么?例如
到 lambda 实际执行时,该函数可能已经完成。那么会发生什么呢?按值捕获就像绑定一堆变量一样吗?
c++ - 如何限制在 C++ AMP 中执行操作的线程数
我正在使用 C++ AMP 对大量线程执行一系列计算。计算的最后一步是修剪结果,但仅限于有限数量的线程。例如,如果计算结果低于阈值,则将结果设置为 0,但仅对最多 X 个线程执行此操作。本质上这是一个共享计数器,也是一个共享条件检查。
任何帮助表示赞赏!
c++ - C++ AMP 性能问题 - 没有任何数据移动的显着不一致性能
我有一个算法,它依赖于大约。15 个不同的 array_views 和 8 个不同的 for_each AMP 内核调用。该算法的本质是将所有数据复制到 GPU,然后反复执行一组内核调用,直到达到某个阈值。注意:我还没有实现阈值逻辑——这需要将数据检索回 CPU。
完整的内核调用集称为一个循环。在每个周期之间,我不引用 CPU 上的任何 array_view 数据....因此,我不希望任何数据移动回 CPU。然而,周期的表现并不规律。大多数情况下,循环需要 10 毫秒左右,但随后每 3 或 4 个循环(或有时背靠背),循环需要 400 或 500 毫秒来执行。内核调用的内部逻辑始终基本相同......所以增加的执行时间不是由于GPU逻辑。
什么可能导致某些周期的时间急剧增加?请参阅下面的示例时序。
完成第一个周期的时间 503.278 (ms) 此时间包括 AMP 初始化、内核编译和数据移动到 GPU 的开销。
768 (ms) 再完成 20 个周期的时间:511.538 (ms) 再完成 21 个周期的时间:14.4339 (ms) 再完成 22 个周期的时间:252.77 (ms) 再完成 23 个周期的时间:504.565 (ms) 时间再完成 24 个循环:12.6931 (ms) 再完成 25 个循环的时间:15.5403 (ms) 再完成 26 个循环的时间:303.68 (ms) 再完成 27 个循环的时间:440.331 (ms) 再完成 28 个循环的时间:8.63698 (ms) 再完成 29 个循环的时间:13.9312 (ms) 再完成 30 个循环的时间:755.637 (ms) 退出......按任意键继续。. . 5403 (ms) 再完成 26 个周期的时间:303.68 (ms) 再完成 27 个周期的时间:440.331 (ms) 再完成 28 个周期的时间:8.63698 (ms) 再完成 29 个周期的时间:13.9312 (ms) 时间再完成 30 个循环:755.637 (ms) Exiting...... 按任意键继续。. . 5403 (ms) 再完成 26 个周期的时间:303.68 (ms) 再完成 27 个周期的时间:440.331 (ms) 再完成 28 个周期的时间:8.63698 (ms) 再完成 29 个周期的时间:13.9312 (ms) 时间再完成 30 个循环:755.637 (ms) Exiting...... 按任意键继续。. .