2017-03-07 88 views
1

我是一名業餘愛好者,並希望將我的GPU用於我的個人項目。 我已經安裝並運行了Alea 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的拋出: 'System.Exception的' 在Alea.dll 其他信息:無法獲得域 「$ VB $當地庫存」。

接下來我試圖定義一個'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) 

這就是我現在得到:

拋出異常: 'System.Exception的' 在Alea.dll 其他信息:非blittable陣列MyApp.MainWindow + InventoryItem []轉不允許,你可以通過app.config來改變它。

但我不知道該部分是怎麼樣的,我可以添加到app.config文件中,我還沒有發現任何聯機來解決這個問題。

+0

爲什麼這標誌着C#? – MickyD

+0

@MickyD這是建議的標籤之一,因爲vb。net和c#是如此相似,有相同問題的人可能會在這裏找到解決方案。如果這不符合要求,我應該刪除標籤嗎? – VampireMonkey

+0

第一個錯誤消息似乎表明'Inventory'是一個成員變量,只有局部變量在該上下文中受支持。假設它是一個字段,嘗試聲明一個本地並將字段值賦給它並在lambda中使用它。這種限制的原因可能是某個領域可能會從其他地方改變。 – jmcilhinney

回答

0

至於第二個例外,下面的頁面顯示了.NET配置文件設置Alea的GPU的基礎知識:

http://www.aleagpu.com/release/3_0_2/doc/faq.html

讀書,我檢查了Alea.Settings類型的文檔後,並發現它有一個MemorySettingElements.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> 
+0

好了,現在我已經得到了過去,現在我不但得不到這樣的: '類型的未處理的異常「System.Exception的」發生在mscorlib.dll 其他信息:不支持對非託管封送的鍵入MyApp.MainWindow + InventoryItem(i32).' 如果我理解這個權利,它表示索引32有問題,不確定附加信息的含義。 – VampireMonkey

+0

'i32'部分可能指的是32位整數,即VB中的Integer。我從來沒有使用過Alea GPU,事實上,在閱讀這個問題之前從未聽說過它,所以我遠離專家。事實上,默認情況下它不支持非blittable(不可bittable)類型,並且這種關於不支持編組自定義類型的新錯誤消息表明它僅用於簡單類型。我不知道解決方案是什麼,但我知道你可能需要對它的支持做更多的研究。 – jmcilhinney