none
請問如何指定VB.net開發的應用程式,指定給某一個CPU Core處理? RRS feed

  • 問題

    • 作業系統版本-Windows Server 2003
    • 開發工具版本-Visual Studio 2008
    • 開發環境-Windows Form

    想要寫一個簡單的運算程式,但必須在多核心CPU中指定由那個核心進行運算,不曉得是否有相關的資訊可以參考;
    甚至不知道有沒有可能寫一支vb.net的程式,去管理CPU核心的運作!
    謝謝!

    • 已移動 璉璉Moderator 2009年6月13日 上午 05:25 ([Loc]From:Visual Studio一般討論區(General))
    2009年6月9日 上午 07:30

解答

  • 2009年6月9日 上午 08:25
  • 考慮到未來 .Net 版本可能會支援取得 hThread / ThreadId ,我只呼叫一個 API ,其他的讓 .Net 類別來做,以便未來版本可以迅速改回純 .Net 程式,這個見仁見智,沒有絕對的寫法。
    範例程式碼:

    <Runtime.InteropServices.DllImport("Kernel32.DLL", CharSet:=Runtime.InteropServices.CharSet.Auto)> _

     Private Function GetCurrentThreadId() As Integer

    End Function

     

    Private Sub Button47_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button47.Click

         Dim currentProcess As Process = Process.GetCurrentProcess()

         For i As Integer = 1 To 2

              Dim nowThread As New Threading.Thread(AddressOf DoBigLoop)

              nowThread.Start()

         Next

    End Sub

     

    Private Sub DoBigLoop()

         SetThreadRunAtProcesser(&HC) ' 設定跑在3, 4 CPU

         Dim rtn As Double

         Dim i, addInt As Integer

         For i = 1 To 50000

              ' 做某些計算騙過 .Net ,無意義的計算 .Net 會自動忽略,不知道該說是編譯器太好還是怎樣... >_<

         Next

    End Sub

     

    Public Sub SetThreadRunAtProcesser(Optional ByVal threadAffinityMask As Integer = -1)

         Dim pt As ProcessThread = GetCurrentProcessThread()

         pt.ProcessorAffinity = threadAffinityMask

    End Sub

     

    Private Function GetCurrentProcessThread() As ProcessThread

         Dim nowThreadId As Integer = GetCurrentThreadId()

         Dim colPT As ProcessThreadCollection = Process.GetCurrentProcess().Threads

         For Each pt As ProcessThread In colPT

              If nowThreadId = pt.Id Then Return pt

         Next

    End Function

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年6月12日 上午 03:27

所有回覆

  • 這是作業系統在管的,.Net 函式庫沒有得管。

    看了 HPC / MPI 都沒看到,應該是沒有開放給使用者權限動。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年6月9日 上午 07:55
  • 謝謝您的回覆,也就是說.net沒有機會去管理到這一段,
    目前我只知道利用WMI去取得資料,還以為可以讀取,也有機會控制,殘念;
    不曉得有沒有其他的程式語言可以做的到嗎?
    2009年6月9日 上午 08:06
  • 2009年6月9日 上午 08:25
  • LabVIEW 8.x,記得看過廠商展示過,沒試過,參考看看囉...

    針對多核心處理器,以 LabVIEW 最佳化自動的測試應用
    http://zone.ni.com/devzone/cda/tut/p/id/6371

    程式執行時如何分配雙核心CPU的資源
    http://labview360.com/forum/forum_posts.asp?TID=10446&KW=breakingdanc

    2009年6月9日 上午 08:36
  • 用 tihs 的參考資料為關鍵字,查了一堆資料,果然 .Net 還是沒辦法直接做,但是呼叫 API 後就可以了。

    因為 New Thread 裡面沒有 ThreadId / hThread 可用。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年6月9日 下午 02:42
  • 感謝大家提供資訊與協助,我會看一下資料,如果有試出來,在跟大家報告,
    請問心冷熱情熄您所說的呼叫API以後就可以,有可以知道是哪個API嗎?謝謝!
    2009年6月12日 上午 01:25
  • Third approach – Valid but unmanaged

    The third approach will “dllimport” kernel32.dll and use some of it´s functions. This method is tested and works correctly. Here we go:

    [DllImport("kernel32.dll")] 
    static extern IntPtr GetCurrentThread();

    [DllImport("kernel32.dll")] 
    static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);

    SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << (int)cpuID));

    應該是tihs大網址裡的這個吧...

    2009年6月12日 上午 01:34
  • 考慮到未來 .Net 版本可能會支援取得 hThread / ThreadId ,我只呼叫一個 API ,其他的讓 .Net 類別來做,以便未來版本可以迅速改回純 .Net 程式,這個見仁見智,沒有絕對的寫法。
    範例程式碼:

    <Runtime.InteropServices.DllImport("Kernel32.DLL", CharSet:=Runtime.InteropServices.CharSet.Auto)> _

     Private Function GetCurrentThreadId() As Integer

    End Function

     

    Private Sub Button47_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button47.Click

         Dim currentProcess As Process = Process.GetCurrentProcess()

         For i As Integer = 1 To 2

              Dim nowThread As New Threading.Thread(AddressOf DoBigLoop)

              nowThread.Start()

         Next

    End Sub

     

    Private Sub DoBigLoop()

         SetThreadRunAtProcesser(&HC) ' 設定跑在3, 4 CPU

         Dim rtn As Double

         Dim i, addInt As Integer

         For i = 1 To 50000

              ' 做某些計算騙過 .Net ,無意義的計算 .Net 會自動忽略,不知道該說是編譯器太好還是怎樣... >_<

         Next

    End Sub

     

    Public Sub SetThreadRunAtProcesser(Optional ByVal threadAffinityMask As Integer = -1)

         Dim pt As ProcessThread = GetCurrentProcessThread()

         pt.ProcessorAffinity = threadAffinityMask

    End Sub

     

    Private Function GetCurrentProcessThread() As ProcessThread

         Dim nowThreadId As Integer = GetCurrentThreadId()

         Dim colPT As ProcessThreadCollection = Process.GetCurrentProcess().Threads

         For Each pt As ProcessThread In colPT

              If nowThreadId = pt.Id Then Return pt

         Next

    End Function

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年6月12日 上午 03:27
  • 移文至Visual Basic


    T.L. Cheng
    2009年6月13日 上午 05:25
    版主