为了使用GPU实现算法,我需要更新一些用于算法的代码。然而,代码严重依赖于面向对象的编程模型.我的问题是,是否有可能将对象传递给parallel for each?如果没有,是否有任何可行的方法可以使我免于重新编写整个代码。如果这看起来很幼稚的话,我很抱歉。C++-AMP是我在GPU编程中使用的第一种语言.因此,我在这个领域的经验是有限的。
发布于 2013-11-05 19:26:57
您的问题的答案是肯定的,因为您可以将类或结构传递给标记为restrict(amp)的lambda。请注意,parallel_for每个`不是AMP限制的,它的lambda是。
但是,您仅限于使用GPU支持的类型。这更多的是目前GPU硬件的限制,而不是C++ AMP。
与C++ AMP兼容的函数或lambda只能使用与C++ AMP兼容的类型,其中包括:
这意味着禁止某些数据类型:
引用和指针(指向兼容类型)可以在本地使用,但无法被lambda捕获。不允许函数指针、指针到指针等;静态变量或全局变量也不允许.如果要使用类的实例,类必须满足更多规则。它们必须没有虚拟功能或虚拟继承。允许构造函数、析构函数和其他非虚函数。成员变量都必须是兼容的类型,当然,只要这些类符合相同的规则,这些变量就可以包含其他类的实例。
..。来自C++ AMP书,Ch,3。
因此,尽管您可以这样做,但出于性能原因,它可能不是最好的解决方案。CPU和GPU缓存有些不同。这使得结构数组成为CPU实现的更好选择,而GPU通常在使用数组结构时表现得更好。
GPU硬件的设计是为了提供最好的性能,当一个翘曲中的所有线程正在访问连续内存并对该数据执行相同的操作时。因此,GPU内存被设计成以这种方式访问时效率最高,这一点也就不足为奇了。事实上,在一个翘曲中,不同线程对同一传输线的加载和存储操作被合并成一个事务。传输线路的大小与硬件有关,但通常,如果您专注于尽可能使内存访问尽可能连续,则代码不必考虑这一点。 ..。Ch.7.
如果您查看我的N体实例的CPU和GPU实现,您将看到用于CPU和GPU的两种方法的实现。
以上并不意味着当您将实现移动到C++ AMP时,您的算法不会运行得更快。这只是意味着您可能会留下一些额外的性能。我建议您尽可能使用最简单的端口,然后考虑如果您想投入更多的时间来优化代码,可以重写代码以更好地利用GPU的体系结构。
https://stackoverflow.com/questions/19762287
复制相似问题