问题标签 [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++ - 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 最终并没有改变任何东西 - 怎么会?
gpu - 我们如何将网络(图)数据复制到 GPU 中?
如果我想使用 GPU 在网络上进行一些并行计算(通过 C++ AMP 更好),我如何使用 GPU 内存中的网络数据?
如何将邻接列表复制到 GPU 的内存中使用?
邻接矩阵对于大型稀疏网络来说太大了,所以我不想使用邻接矩阵。
c++ - C++ AMP 适用于求逆、QR 分解的矩阵库
我需要一个用于C++ AMP的矩阵库,它能够执行基本操作以及任意大小矩阵的矩阵求逆和 QR 分解。
我最初发现有一个BLAS AMP 实现,但是我找不到任何地方说明 BLAS 是否可以执行矩阵求逆,谁能告诉我它的功能和/或建议一个更适合 AMP 的并行矩阵库?谢谢!
编辑:我找到了一个能够进行矩阵求逆的LAPACK AMP 库(我认为),但它仍在开发中 :(
c++ - 使用 C++-AMP 减少未排序向量搜索的运行时间
我编写了一个程序,该程序通过结构的未排序向量进行大量搜索以查找唯一元素的索引。此搜索在 for 循环中的每次迭代中进行多次,并且向量内的数据在 for 循环迭代期间多次更改(仅添加数据,不删除任何内容)。现在程序做我想做的事情,但是比较慢,所以在我让VS2012分析我的程序的性能后,我发现程序有超过80%的时间是在搜索未排序的向量,所以我很自然地想要优化搜索。我知道我能得到的最好的结果是 O(n),因为它是一个未排序的向量(每个元素都是唯一的,元素的顺序一旦插入就不能改变),但我希望以某种方式减少运行时间。
我一直在考虑使用并行处理来减少程序运行时间,微软的 AMP 库看起来很有希望。从外观上看,您可以使用并行处理来遍历数组以查找数组中的元素。但是未排序向量中的数据变化很大,所以这不会将瓶颈从迭代向量转移到从 CPU 到 GPU 的数据传输,或者有 AMP 内置优化来解决这个问题吗?请记住:向量中的数据仅添加到向量的末尾,不会删除任何内容。
以防万一:这是我使用的向量和搜索功能:
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(单核)代码慢。
我想知道为什么,以及任何可以帮助我加快计算速度的人。
非常感谢。
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 个?
还是我只是做错了,而我没有得到更好的解决方案?
请帮忙!
c++ - 如何在 C++ AMP 中同步线程?
我正在尝试使用 C++ AMP 计算斐波那契,每个数字将取决于其前两个。所以代码是这样的:
第三个线程( idx[0] == 2 )将在这一行等待:
它不会被设置为非零数,因此所有线程都将简单地卡在循环中。
有什么出路吗?
c++ - 如何同时使用 parallel_for_each 函数和 __declspec(dllexport) 属性
最近我写了一个这样的函数:
Visual Studio 报告以下错误:
错误 C1451:编译 concurrency::parallel_for_each 的调用图时无法生成调试信息
删除DLLEXPORT
修饰符后,错误消失了,但我无法再将此功能导出到其他程序。
我该如何解决这个问题?
c++ - 将数据复制到 tile_static 以用于 tile 中的线程
我正在尝试将数据复制到 tile_static 以进行长期运行的过程。在我看到的所有示例中,声明了一个数组,并为磁贴中的每个线程逐个填充数据。然后这些线程共享该数据。我想要做的只是用 tile_static 复制一些数据以供单个线程使用。我不需要分享它,但由于它对于长时间运行的线程来说非常重要,我的理解是它会提高性能。我不确定这是否是正确的方法。我试图进行的 tile_static 调用位于 parallel_for_each 循环的底部附近,如下所示:
为了清楚起见,我包含了额外的代码。
c++-amp - 使用 C++-AMP 进行面向对象编程
我需要更新一些用于 Aho-Corasick 算法的代码,以便使用 GPU 实现该算法。但是,代码严重依赖于面向对象的编程模型。我的问题是,是否可以将对象传递给parallel for each
?如果不; 有什么办法可以使我免于再次重写整个代码。如果这似乎是幼稚的问题,我深表歉意。C++-AMP 是我在 GPU 编程中使用的第一种语言。因此,我在这个领域的经验非常有限。