Joh*_*han 14 c# linq gpu dynamic-linq
我一直在寻找有关使用GPU加速LINQ查询的可能性的可靠信息.
到目前为止我已经"调查过"的技术:
简而言之,甚至可以对GPU上的对象进行内存中过滤吗?
假设我们有一些对象的列表,我们想要过滤类似的东西:
var result = myList.Where(x => x.SomeProperty == SomeValue);
Run Code Online (Sandbox Code Playgroud)
关于这个的任何指针?
提前致谢!
UPDATE
我会尝试更具体地说明我想要实现的目标:)
目标是使用任何技术,能够以绝对最快的方式过滤对象列表(范围从~50 000到〜2 000 000).
在完成过滤(sum,min,max等)时对数据执行的操作是使用内置的LINQ方法完成的,并且对于我们的应用程序已经足够快,所以这不是问题.
瓶颈是"简单地"过滤数据.
UPDATE
只是想补充一点,我已经测试了大约15个数据库,包括MySQL(检查可能的集群方法/ memcached解决方案),H2,HSQLDB,VelocityDB(目前正在进一步调查),SQLite,MongoDB等,而NONE就足够了过滤数据的速度(当然,NO-sql解决方案不提供像sql那样,但你得到了想法)和/或返回实际数据.
只是总结一下我/我们需要的东西:
一种数据库,能够在不到100毫秒的时间内对200列和大约250 000行的数据进行排序.
我目前有parallellized LINQ的解决方案,它能够(在特定的机器上)只花纳米过滤时每行-seconds 和处理的结果!
所以,我们需要像子纳米每行5秒-过滤.
日志文件中的一些数字:
Total tid för 1164 frågor: 2579
Run Code Online (Sandbox Code Playgroud)
这是瑞典语并翻译:
Total time for 1164 queries: 2579
Run Code Online (Sandbox Code Playgroud)
在这种情况下,查询是这样的查询:
WHERE SomeProperty = SomeValue
Run Code Online (Sandbox Code Playgroud)
这些查询都是在225639行上并行完成的.
因此,225639行在大约2.5秒内在存储器中被过滤1164次.
这是9,5185952917007032597107300413827e-9秒/行,但是,还包括数字的实际处理!我们做Count(非null),总计数,Sum,Min,Max,Avg,Median.因此,我们对这些过滤行进行了7次操作.
所以,我们可以说it's实际上快7倍比数据库we've尝试,因为我们不要做任何聚集的东西,在这种情况下!
总而言之,与内存LINQ过滤相比,为什么数据库在过滤数据方面如此差劲?微软真的做得这么好,以至于无法与它竞争吗?:)
虽然内存中过滤应该更快,但我不想要感觉它更快.我想知道什么是更快,如果可能的原因.
我将最终回答有关Brahma的问题,因为它是我的图书馆,但它也可能适用于其他方法.GPU不了解对象.它的内存也大部分与CPU内存完全分开.
如果您确实拥有大量对象并希望对它们进行操作,则只能将要操作的数据打包到适合您正在使用的GPU/API的缓冲区中,然后将其发送以进行处理.
请注意,这将在CPU-GPU内存接口上进行两次往返,所以如果你在GPU上没有做足够的工作以使它值得,那么你会比你最初只使用CPU时慢(像上面的样本).
希望这可以帮助.