Intel MKL 多線程設置

對于多核程序,多線程對于程序的性能至關重要。 下面,我們將對Intel MKL 有關多線程方面的設置做一些介紹:

我們提到MKL 支持多線程,它包括的兩個概念:
1>MKL 是線程安全的: MKL在設計時,就保證它是一個線程安全的庫函數。 也就是說,無論是在單個線程中調用MKL函數,還是在多個線程中同時使用Intel MKL 函數,都能夠確保函數有正確的計算結果。

2>MKL函數內部實現了多線程優化。許多MKL的函數,已經包括內部多線程的實現。用戶調這些函數時,只需設置多線程的數目,MKL 函數的內部,就可以同時進行多個線程的并行計算。 Intel MKL 還提供了一個單線程版本的庫函數,這個版本中,每個函數只運行串行代碼。 我們需要在鏈接的時候,需要選擇鏈接串行(單線程)的MKL函數,還是并行(多線程)的MKL 的函數。 下面我們提到的多線控制的方法,主要是針對的并行的MKL函數庫。

那么,在MKL 的多線程庫中, 如何設置MKL 多線程的數目呢? Intel MKL 使用了OpenMP實現了多線程,所以OpenMP的環境變量與API對MKL 的多線程設置仍然有效。 除了OpenMP的方法外,MKL還提供了,其它的設置多線程的環境變量與API:

環境變量對應的API說明對于的OMP的變量
MKL_NUM_THREADSmkl_set_num_threads建議MKL 函數使用的多線程的數目。.OMP_NUM_THREADS
OMP_NUM_THREADSomp_set_num_threadsOpenMP提供的多線程設置的環境變量與API.?
MKL_DYNAMICmkl_set_dynamic建議MKL根據計算問題,自動設置多線程的數目,線程數目不超過用戶設定的線程的上限OMP_DYNAMIC

需要說明的是,Intel MKL 提供的多線程設置的方法,優先級要高于OpenMP的方法。 比程序中,同時設置了下面的環境變量:
>export MKL_NUM_THREADS =1
>export OMP_NUM_THREADS =4
此時,程序中,MKL的函數將會運行一個線程。

關于多線程的設置,我們還需要注意下面的3個問題:
第一,在超線程的機器上,Intel MKL 多線程的設置: 在系統中,當多個線程的執行不同的操作,CPU有空閑資源時,多線程技術有較好的執行效果。Intel MKL的計算核心已經經過充分優化,并且這些計算的核心都執行類似的計算操作,所有多線程的設置,對于MKL 不能提供很好的幫助。 如果在程序執行的機器上, 超線程的設置已經打開, 一個推薦的做法是,設置MKL 的線程為系統核的數目(邏輯處理器數目的一半),并設置下面的threading affinity 的環境變量:
KMP_AFFINITY=granularity=fine,compact,1,0.

第二,MKL_DYNAMIC 環境變量: 這個環境變量確定是否由Intel MKL 來選擇計算的線程的數目, 但是總的線程數不會超過MKL_NUM_THREADS與OMP_NUM_THREADS的值。 Intel MKL會根據實際計算問題的大小,以及多線程對計算是否有效等諸多情況,選擇適合的線程數目,這也是缺省的Intel MKL 多線程設置方式。

如果用戶手動設置MKL_DYNAMIC=FALSE, Intel MKL 將根據用戶指定的線程數目,設置計算線程。 比如,設置:
MKL_DYNAMIC=FALSE
MKL_NUM_THREADS=6
MKL函數將運行6個計算線程,盡管對某些小的計算問題,6個線程可能并不是最有效的。

第三,并不是所有MKL函數都是多線程。 某些計算函數,多線程并不能給程序帶來性能提升,如Level 1 BLAS,其主要計算瓶頸是數據訪問,這樣的函數,內部多線程,不能帶來很大幫助。 具體的MKL 多線程的函數列表, 可以查看用戶手冊。

有關多線程這方面的,進一步的參考文檔: 
MKL 用戶手冊:http://software.intel.com/sites/products/documentation/hpc/mkl/mkl_userguide_lnx/index.htm
相關文章:
http://software.intel.com/en-us/forums/showthread.php?t=67622
http://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-intel-mkl-100-threading/
http://software.intel.com/en-us/articles/setting-thread-affinity-on-smt-or-ht-enabled-systems/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451989.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LA3415 訓練指南】保守的老師 【二分圖最大獨立集,最小割】

題意 Frank是一個思想有些保守的高中老師。有一次,他需要帶一些學生出去旅行,但又怕其中一些學生在旅行中萌生愛意。為了降低這種事情發生的概率,他決定確保帶出去的任意兩個學生至少要滿足下面四條中的一條。 1.身高相差大于40厘米 2.性別相…

行車記錄儀穩定方案:TC358778XBG:RGB轉MIPI DSI芯片,M-Star標配IC

原廠:Toshiba型號:TC358778XBG功能:TC358778XBG是一顆將RGB信號轉換成MIPI DSI的芯片,最高分辨率支持到1920x1200,其應用圖如下:產品特征:MIPI接口:(1)、支持…

java.sql.SQLException: 無法轉換為內部表示之解決

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 這個錯是因為 數據庫中字段類型和程序中該字段類型不一致。 比如程序將某字段當做Integer類型, 而數據庫存儲又使用另外一…

網絡爬蟲--17.【BeautifuSoup4實戰】爬取騰訊社招

文章目錄一.要求二.代碼示例一.要求 以騰訊社招頁面來做演示:http://hr.tencent.com/position.php?&start10#a 使用BeautifuSoup4解析器,將招聘網頁上的職位名稱、職位類別、招聘人數、工作地點、發布時間,以及每個職位詳情的點擊鏈接…

public static void main(String[] args)的理解

public:權限修飾符,權限最大。static:隨著MianDemo類的加載而加載,消失而消失。void: 沒有返回值main: 函數名,jvm識別的特殊函數名(String[] args):定義了一個字符串數組參數。這個字符串數組是保存運行main函數時輸入的參數的

Miller-Rabin素數測試

Miller-Rabin素數測試 給出一個小于1e18的數,問它是否為質數?不超過50組詢問。hihocoder 我是真的菜,為了不誤導他人,本篇僅供個人使用。 首先,一個1e18的數,樸素\(O(\sqrt{n})\)素數判定肯定爆炸。怎么辦呢…

throws Exception的意思

在方法聲明部分使用,表示該方法可能產生此異常,如果在方法聲明處使用了throws聲明異常,則該方法產生異常也不必捕獲,會直接把異常拋出到調用該方法的地方。

java list按照元素對象的指定多個字段屬性進行排序

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 直接提取重點代碼: /*** 把結果集合按時間字段排序,內部類重寫排序規則:* param list* return*/priv…

網絡爬蟲--18.python中的GIL(全局解釋器鎖)、多線程、多進程、并發、并行

參考文獻: python的GIL、多線程、多進程 并發和并行的區別? GIL(全局解釋器鎖)一看就懂的解釋! 多謝作者分享!

Socket和ServerSocket

對于即時類應用或者即時類的游戲,HTTP協議很多時候無法滿足于我們的需求。這會,Socket對于我們來說就非常實用了。下面是本次學習的筆記。主要分異常類型、交互原理、Socket、ServerSocket、多線程這幾個方面闡述。異常類型在了解Socket的內容之前&#…

徹底搞清楚Android中的 Attr

版權聲明:本文為sydMobile原創文章,轉載請務必注明出處! https://blog.csdn.net/sydMobile/article/details/79978187 相信這個詞對于Android開發者來說十分熟悉了,那么你對他到底有多了解呢? 回憶起我剛開始接觸Andr…

D. Relatively Prime Graph

Lets call an undirected graph G(V,E)G(V,E) relatively prime if and only if for each edge (v,u)∈E(v,u)∈E GCD(v,u)1GCD(v,u)1 (the greatest common divisor of vv and uu is 11). If there is no edge between some pair of vertices vv and uu then the value of GC…

解決 : org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.tanj.mapper.SendDeta…

網絡爬蟲--19.【Scrapy-Redis實戰】分布式爬蟲爬取房天下--環境準備

文章目錄0. 思路一. 虛擬機Ubuntu0中安裝Redis二. 虛擬機Ubuntu1中安裝Redis三. Windows服務器上安裝Redis四. 安裝cmder五. 安裝RedisDesktopManager六. 修改Windows中的配置文件redis.windows.conf七. Ubuntu連接Windows上 的Redis服務器-----------------------------------…

開發人員,請愛護你的身體

最近一周身體極度不適,口腔潰瘍、嗓子痛、感冒咳嗽、發燒,統統來了一個遍,非常痛苦。所以最近一直關注有關于軟件開發人員的身體健康問題的網站、文章。 看了許多文章,在結合自己在這一周之內痛苦的感受,所以才寫這樣…

tkinter中scale拖拉改變值控件(十一)

scale拖拉改變值控件 使用戶通過拖拽改變值 簡單的實現: 1 import tkinter2 3 wuya tkinter.Tk() 4 wuya.title("wuya") 5 wuya.geometry("300x2001020") 6 7 8 # 創建對象 9 scale1 tkinter.Scale(wuya, from_0, to100) 10 scale1.pac…

vue+elementUI開發實踐問題總結

最近公司項目采用vue,實行前后端分離開發,采用element-ui框架,對于項目中遇到的問題進行記錄,便于日后查詢。 vueelementui怎樣點擊table中的單元格觸發事件?官方文檔是采用的cell-click方式。實際項目中需要在不同的t…

Socket的getInputStream()方法

Socket的getInputStream()方法可以獲得網絡連接輸入,同時返回一個InputStream實例 。

計算機圖形學理論(4):緩沖區

本系列根據國外一個圖形小哥的講解為本,整合互聯網的一些資料,結合自己的一些理解。 什么是緩沖區? 緩沖區是保存某些數據的臨時存儲空間。 為什么我們需要緩沖區?原因很簡單,當數據量很大時,因為計算機無…

解決:Every derived table must have its own alias

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias 解決&…