【问题标题】:Iterate over a collection of custom Classes with Alea GPU使用 Alea GPU 迭代一组自定义类
【发布时间】: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 这不是我对数组所做的吗?

标签: vb.net aleagpu


【解决方案1】:

关于第二个例外,以下页面显示了在 .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>

【讨论】:

  • 好的,现在我已经解决了那个 bittable 问题,现在我得到了这个:An unhandled exception of type 'System.Exception' occurred in mscorlib.dll Additional information: Unsupported of unmanaged marshaler for type MyApp.MainWindow+InventoryItem(i32). 如果我理解正确,它说索引 32 有问题,不确定是什么附加信息意味着。
  • 那个'i32'部分可能是指一个32位整数,即VB中的Integer。我从未使用过 Alea GPU,事实上,在阅读这个问题之前,我什至从未听说过它,所以我远非专家。默认情况下它不支持非 blittable(不可 bittable)类型的事实以及有关不支持编组自定义类型的新错误消息表明它仅适用于简单类型。我不知道解决方案是什么,但我知道您可能需要对其支持的内容进行更多研究。
猜你喜欢
  • 2016-07-28
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2016-06-18
  • 2018-05-20
  • 1970-01-01
  • 2023-03-20
  • 2018-11-20
相关资源
最近更新 更多