问题标签 [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.

0 投票
2 回答
1123 浏览

c++ - C++ AMP:array_view 和 index 行为异常(存储了意外的值)

我编写了一个小测试函数,它的行为与我想要的不同。

基本上,它应该读取一个数组并写回它的内容(稍后,当它工作时,它应该做更多,但现在即使这样也失败了)。

调试到 GPU 代码,我看到前几次迭代(不知何故并行执行.. 这可能对 GPU 有意义,但当我调试时让我感到惊讶)工作正常.. 但是,在 1-2 次调试后继续(F5),一些以前正确设置的值被 0 覆盖。我真的不明白..当我再次上CPU时,许多值都是0,即使它们不应该是0(基本上,它们应该有原始数据,这是一个简单的测试序列)。

如此简单(计划)的步骤:

  • 初始化数组
  • 将数组传递给 GPU(作为无符号整数数组)
  • 将每个 unsigned int 拆分为 4 个字节并将它们存储在浮点数中
  • (做一些计算,为简单起见这里省略)
  • 将 bytes-stored-in-floats 再次连接到原始位置
  • (重复)

如果您想知道..那应该是颜色值..

结果是:

  • 一些值符合预期,但大多数值不同
  • 似乎特别是字节0(每个无符号整数)会有一个坏值
  • 我首先尝试使用 & 0xFF 转换 unsigned int->byte->float 但这似乎完全失败了

输出是(但应该只是从 0 开始递增的数字):

0, 1, 2, 3, 0, 5, 6, 7, 0, 9, 10, 11, 16, 13, 14, 15, 0, 17, 18, 19, 32, 21, 22, 23, 32, 25, 26, 27, 32, 29, 30, 31, 0, 33, 34, 35, 64, 37, 38, 39, 64, 41, 42, 43, 64, 45, 46, 47, 64, 49,

问题:

  • 为什么& 0xFF有问题?
  • 为什么每个 unsigned int 的字节 0 都分配了一个奇怪的值?
  • 我想我不能创建一个字节数组视图,我必须使用整数或浮点数?
  • 注释掉 .synchronize 最终并没有改变任何东西 - 怎么会?
0 投票
2 回答
183 浏览

gpu - 我们如何将网络(图)数据复制到 GPU 中?

如果我想使用 GPU 在网络上进行一些并行计算(通过 C++ AMP 更好),我如何使用 GPU 内存中的网络数据?

如何将邻接列表复制到 GPU 的内存中使用?

邻接矩阵对于大型稀疏网络来说太大了,所以我不想使用邻接矩阵。

0 投票
2 回答
876 浏览

c++ - C++ AMP 适用于求逆、QR 分解的矩阵库

我需要一个用于C++ AMP的矩阵库,它能够执行基本操作以及任意大小矩阵的矩阵求逆和 QR 分解。

我最初发现有一个BLAS AMP 实现,但是我找不到任何地方说明 BLAS 是否可以执行矩阵求逆,谁能告诉我它的功能和/或建议一个更适合 AMP 的并行矩阵库?谢谢!

编辑:我找到了一个能够进行矩阵求逆的LAPACK AMP 库(我认为),但它仍在开发中 :(

0 投票
1 回答
247 浏览

c++ - 使用 C++-AMP 减少未排序向量搜索的运行时间

我编写了一个程序,该程序通过结构的未排序向量进行大量搜索以查找唯一元素的索引。此搜索在 for 循环中的每次迭代中进行多次,并且向量内的数据在 for 循环迭代期间多次更改(仅添加数据,不删除任何内容)。现在程序做我想做的事情,但是比较慢,所以在我让VS2012分析我的程序的性能后,我发现程序有超过80%的时间是在搜索未排序的向量,所以我很自然地想要优化搜索。我知道我能得到的最好的结果是 O(n),因为它是一个未排序的向量(每个元素都是唯一的,元素的顺序一旦插入就不能改变),但我希望以某种方式减少运行时间。

我一直在考虑使用并行处理来减少程序运行时间,微软的 AMP 库看起来很有希望。从外观上看,您可以使用并行处理来遍历数组以查找数组中的元素。但是未排序向量中的数据变化很大,所以这不会将瓶颈从迭代向量转移到从 CPU 到 GPU 的数据传输,或者有 AMP 内置优化来解决这个问题吗?请记住:向量中的数据仅添加到向量的末尾,不会删除任何内容。

以防万一:这是我使用的向量和搜索功能:

0 投票
2 回答
556 浏览

c++ - AMP C++ 加速体积计算

  • 设备:特斯拉 C2050
  • 操作系统:Windows 7 企业版
  • IDE:VS 2012

大家好。我正在使用 AMP C++ 进行一些体积计算。

我有数百万个四面体,一点在 (0,0,0)。所以我可以用一种简单的方式得到四面体的体积:

因此,我想通过使用 AMP C++ 来加快计算速度。

这是代码。

主要功能是:

所以,每一项工作都失败了。但有趣的是。它比 CPU(单核)代码成本更高。

CPU(单核)上的 C++ 花费 0.085 秒来完成 1024 * 1024 * 2 个三角形的计算。但是 AMP C++ 代码需要 0.530 秒。比 c++ 代码要多得多。

在网上搜索后,有一个提示:如果我们先预热设备,我们可以得到“实时”计算的时间成本。

所以我首先计算 128 个三角形来预热设备(花费大约 0.2 秒),然后通过计算 1024 * 1024 * 2 个三角形得到体积。它变得更快(花费大约 0.091 秒),但仍然比 CPU(单核)代码慢。

我想知道为什么,以及任何可以帮助我加快计算速度的人。

非常感谢。

0 投票
1 回答
450 浏览

c++ - 对如何在 C++ AMP 上执行大任务一无所知

我的任务是查看我开发的算法是否可以使用 GPU 而不是 CPU 上的计算更快地运行。我是加速器计算的新手,我得到了一本我已经彻底阅读过的书“C++ AMP”,我认为我对它的理解相当好(我过去用 C 和 C++ 编写过代码,但现在主要是 C#)。

但是,当进入实际应用程序时,我似乎只是不明白。所以,如果可以的话,请帮助我。

假设我有一个任务来计算一些复杂的函数,该函数需要一个巨大的矩阵输入(如 50000 x 50000)和一些其他数据并输出相同大小的矩阵。整个矩阵的总计算需要几个小时。

在 CPU 上,我只是将任务分成几部分(部分数量大约为 100 左右)并使用 Parralel.For 执行它们,或者只是我自己编写的一个简单的任务管理循环。基本上,保持几个线程运行(线程数 = 内核数),当线程完成时开始新的部分,直到所有部分都完成。而且效果很好!

但是,在 GPU 上,我不能使用相同的方法,不仅因为内存限制(没关系,可以分成几个部分),而且因为如果某些东西运行超过 2 秒,它被认为是“超时”并且 GPU 得到重置!因此,我必须确保我的计算的每个部分运行时间少于 2 秒。

但这并不是每个任务(例如,将一个小时的工作分成 60 个任务,每个任务 1 秒),这很容易,这就是每组任务,因为无论我选择哪种队列模式(立即或自动),如果我运行(通过 parralel_for_each)任何总共需要超过 2 秒才能执行的东西,GPU 将被重置。

不仅如此,如果我的 CPU 程序占用了所有 CPU 资源,只要它保持较低的优先级,UI 就会保持交互 - 系统是响应式的,但是,当在 GPU 上执行代码时,屏幕似乎被冻结,直到执行完成!

那么,我该怎么办?在本书的演示(N-Body 问题)中,它表明它的效率应该是 100 倍(多核计算给出 2 gflops,或者 w/e 的 flops 数量,而 amp 给出 200 gflops),但是在实际应用中,我只是不知道该怎么做!

我是否必须将我的大任务划分为数十亿个部分,例如,划分为每个需要 10 毫秒才能执行的部分,并一次在 parralel_for_each 中运行 100 个?

还是我只是做错了,而我没有得到更好的解决方案?

请帮忙!

0 投票
1 回答
1053 浏览

c++ - 如何在 C++ AMP 中同步线程?

我正在尝试使用 C++ AMP 计算斐波那契,每个数字将取决于其前两个。所以代码是这样的:

第三个线程( idx[0] == 2 )将在这一行等待:

它不会被设置为非零数,因此所有线程都将简单地卡在循环中。

有什么出路吗?

0 投票
1 回答
373 浏览

c++ - 如何同时使用 parallel_for_each 函数和 __declspec(dllexport) 属性

最近我写了一个这样的函数:

Visual Studio 报告以下错误:

错误 C1451:编译 concurrency::parallel_for_each 的调用图时无法生成调试信息

删除DLLEXPORT修饰符后,错误消失了,但我无法再将此功能导出到其他程序。

我该如何解决这个问题?

0 投票
1 回答
144 浏览

c++ - 将数据复制到 tile_static 以用于 tile 中的线程

我正在尝试将数据复制到 tile_static 以进行长期运行的过程。在我看到的所有示例中,声明了一个数组,并为磁贴中的每个线程逐个填充数据。然后这些线程共享该数据。我想要做的只是用 tile_static 复制一些数据以供单个线程使用。我不需要分享它,但由于它对于长时间运行的线程来说非常重要,我的理解是它会提高性能。我不确定这是否是正确的方法。我试图进行的 tile_static 调用位于 parallel_for_each 循环的底部附近,如下所示:

为了清楚起见,我包含了额外的代码。

0 投票
1 回答
952 浏览

c++-amp - 使用 C++-AMP 进行面向对象编程

我需要更新一些用于 Aho-Corasick 算法的代码,以便使用 GPU 实现该算法。但是,代码严重依赖于面向对象的编程模型。我的问题是,是否可以将对象传递给parallel for each?如果不; 有什么办法可以使我免于再次重写整个代码。如果这似乎是幼稚的问题,我深表歉意。C++-AMP 是我在 GPU 编程中使用的第一种语言。因此,我在这个领域的经验非常有限。