【发布时间】:2017-03-07 14:23:55
【问题描述】:
我是一名业余爱好者,想将我的 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,以便我可以充分利用我的 PC 的功能。
请记住,所有这些都可以完美地作为一个 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)
'Inventory'是一个自定义类,其中'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 文件中,我还没有在网上找到任何解决这个问题的方法。
【问题讨论】:
-
为什么这个标记为c#?
-
@MickyD 这是建议的标签之一,因为 vb.net 和 c# 非常相似,遇到相同问题的人可能会在这里找到解决方案。如果这不是办法,我应该删除标签吗?
-
第一条错误消息似乎表明
Inventory是一个成员变量,并且在该上下文中仅支持局部变量。假设它是一个字段,请尝试声明一个本地并将字段值分配给它并在您的 lambda 中使用它。这种限制的原因可能是可以从其他地方更改字段。 -
@jmcilhinney 这不是我对数组所做的吗?