我是一个业余爱好者,我想将我的GPU用于个人项目。 我已经安装并运行了Alea GPU包。
以下产生相同的输出:
Dim y(10) As Integer
For i = 0 To 10 - 1
y(i) = i
Next
Dim y2(10) As Integer
Array.Copy(y, y2, y.Length)
Parallel.For(0, y.Length - 1, Sub(i) y(i) += i)
Debug.WriteLine(y.Aggregate(Function(now, future) now + future))
Alea.Gpu.Default.For(0, y2.Length - 1, Sub(i) y2(i) += i)
Debug.WriteLine(y2.Aggregate(Function(now, future) now + future))
两者都返回90.这是最基本的,但我需要的是更多。
我正在尝试将我的其他资源更密集的parallel.foreach循环转换为GPU.Default.For,因此我可以充分利用我的电脑。
请记住,所有这些都可以作为parallel.foreach循环完美运行。其余的代码目前已被注释掉,这是阻止它工作的原因。
Gpu.Default.For(0, Inventory.ItemsInventory.Count - 1,
Sub(i)
Dim Level_1 = Inventory.ItemsInventory.ElementAt(i) 'Exception on this line, doesn't happen if commented out.
end sub)
'库存'是一个自定义类,其中'ItemsInventory'是一个字典(字符串,InventoryItem)'InventoryItem'也是一个自定义类。
我得到的例外是:
抛出ArgumentException:Alea.dll中的'System.Exception' 附加信息:无法获取字段“$ VB $ Local_Inventory”。
接下来我试图定义一个'InventoryItem'数组,因为这是我对这个特定循环感兴趣的。
Dim ItemsArray() As InventoryItem = Inventory.ItemsInventory.Select(Function(f) f.Value).ToArray
Gpu.Default.For(0, ItemsArray.Length - 1,
Sub(i)
Dim Level_1 = ItemsArray(i)
end sub)
这就是我现在所得到的:
抛出异常:Alea.dll中的'System.Exception' 附加信息:不允许使用非blittable数组MyApp.MainWindow + InventoryItem []传输,您可以通过app.config更改此内容。
但是我不知道那个部分是怎么样的,我可以'添加到app.config文件,我还没有找到任何在线解决这个问题。
答案 0 :(得分:0)
关于第二个例外,以下页面显示了在.NET配置文件中设置Alea GPU的基础知识:
http://www.aleagpu.com/release/3_0_2/doc/faq.html
阅读完毕后,我查看了Alea.Settings
类型的文档,发现它的Memory
属性类型为SettingElements.MemoryElement
。
http://www.aleagpu.com/release/3_0_2/api/html/73614a0a-9c5c-cce6-7114-fc6833cb31f2.htm
该类型具有Boolean
属性AllowNonBlittableMemoryTransfer
。
这表明,要在您的方案中允许非blittable类型,您的配置文件应如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="aleaSettings" type="Alea.Settings, Alea"/>
</configSections>
<aleaSettings>
<memory allowNonBlittableMemoryTransfer="true"/>
</aleaSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>