安裝?

從Conda Forge安裝?

到目前為止,安裝PyOpenCL最簡單的方法是使用 Conda Forge . Conda Forge是一個社區維護的軟件包存儲庫 Conda 包管理器。

在Linux或OS X上,以下指令集應該可以工作:

  1. 安裝的版本 miniforgeminiconda 適合你的系統。您可以在您的用戶帳戶中安裝這些軟件,而不需要root/管理員權限。

    請注意,如果您的系統上已經安裝了Continuum Anaconda,您可以直接使用它并執行以下操作 not 需要安裝微型 Python 。

  2. source /WHERE/YOU/INSTALLED/MINICONDA/bin/activate root

  3. conda config --add channels conda-forge

  4. conda install pyopencl

Windows的類似步驟也應該起作用。

請注意,如果沒有提供通過OpenCL訪問硬件的OpenCL設備驅動程序(所謂的“ICD”,用于“可安裝的客戶端驅動程序”),PyOpenCL就沒有樂趣(即無法運行代碼)。如果你收到這樣的錯誤信息 pyopencl.cffi_cl.LogicError: clGetPlatformIDs failed: <unknown error -1001> ,這意味著您沒有安裝OpenCL驅動程序。

注意,驅動程序(icd)是PyOpenCL的獨立軟件。它們可能由您的硬件供應商提供(例如Nvidia或AMD GPU)。如果您有這樣的硬件,請參閱下面的說明,了解如何使用Conda Forge的PyOpenCL使這些硬件工作。

需要注意的是OpenCL并不局限于gpu。事實上,使用OpenCL進行計算不需要特殊的硬件——您現有的CPU就足夠了。在Linux或macOS上,鍵入:

  1. conda install pocl

安裝基于CPU的OpenCL驅動程序。在Windows上,您可以安裝 CPU OpenCL driver from Intel . 在macOS上,pocl可以提供比內置在操作系統中的OpenCL驅動程序顯著的健壯性(有時還有性能)改進。

在Linux和macOS上,可以使用Oclgrind檢測內存訪問錯誤。

  1. conda install oclgrind

在Linux Intel Broadwell或具有Intel圖形卡的較新處理器上,可以使用NEO。

  1. conda install intel-compute-runtime

在Linux Intel Sandybridge或更新的帶有Intel圖形卡的處理器上,可以使用Beignet。

  1. conda install beignet

現在可以運行基于PyOpenCL的代碼了,比如 code examples .

使用供應商提供的OpenCL驅動程序(主要在Linux上)?

上面的說明幫助您獲得一個基本的OpenCL環境,該環境將獨立于您是否有專用硬件(如gpu或fpga)可用。如果你 do 有這樣的硬件,請繼續閱讀如何使其工作。

在Linux上,PyOpenCL通過查找擴展名為 .icd 在目錄中。從Conda安裝的PyOpenCL將在 /WHERE/YOU/INSTALLED/MINICONDA/etc/OpenCL/vendors . 它們只是簡單的文本文件,包含提供OpenCL驅動程序的共享庫的文件名或完全限定路徑名。

注解

如果您在 Conda environment (例如,如果命令行提示符上的環境指示器顯示除 (root) ),則可能需要使用如下路徑:

/WHERE/YOU/INSTALLED/MINICONDA/envs/ENVIRONMENTNAME/etc/OpenCL/vendors

請注意,您應該替換 ENVIRONMENTNAME 使用命令行提示符上括號之間顯示的環境名稱。此路徑(對于當前活動的conda環境)可以從環境變量中獲得 CONDA_PREFIX ,即

$CONDA_PREFIX/etc/OpenCL/vendors (一旦激活Conda環境)。

在Linux上,如果您安裝了其他OpenCL驅動程序(例如GPU),那么這些驅動程序將在 /etc/OpenCL/vendors . 您可以使用以下命令使它們與Conda Forge中的PyOpenCL一起工作:

conda install ocl-icd-system

將確保這些系統范圍的ICD在您的conda環境中也可見。另一種方法是,可以手動從 /etc/OpenCL/vendors 進入,例如。, $CONDA_PREFIX/etc/OpenCL/vendors .

如果您想了解更多信息,請參閱 ocl-icd 及其文件。Ocl icd是PyOpenCL在Linux上從Conda Forge安裝時使用的“icd加載程序”。它表示后面的代碼 libOpenCL.so .

在macOS上,用于Conda Forge的PyOpenCL的打包依賴于 Khronos ICD Loader ,并且它的打包使得內置到操作系統中的OpenCL驅動程序除了手動安裝的其他icd之外,還可以自動使用。

使用Linux控制盤從PyPI安裝?

PyOpenCL在PyPI中分配manylinux1輪。這些輪子與基于GLIBC>=2.5的發行版兼容。

在Linux上,鍵入

  1. pip install pyopencl

wheels附帶了OCL-ICD,并配置為使用任何支持ICD接口的OpenCL實現 /etc/OpenCL/vendors

您還可以使用作為二進制輪子提供的pip安裝以下基于CPU的OpenCL實現。請注意,必須使用pyopencl的輪子來安裝pyopencl,以便識別這些輪子。

要用pocl安裝pyopencl,一種基于CPU的實現方法,

  1. pip install pyopencl[pocl]

要用oclgrind安裝pyopencl,OpenCL調試器需要,

  1. pip install pyopencl[oclgrind]

注解

避免將Conda Forge和PyPI安裝的部件混合。例如,從pip安裝PyOpenCL,然后從Conda Forge安裝OCL-ICD,可以重定向ICD加載程序,從而取消對系統范圍ICD的訪問。

從源安裝?

有關如何安裝PyOpenCL的信息 從源頭PyOpenCL Wiki ,但除非您有非常特殊的需求或希望自己修改PyOpenCL,否則這應該不是必需的。

提示?

語法突出顯示?

您可以通過檢查 this file .

請注意,包含源代碼的三重引號字符串必須以開頭 """http://CL// ...""" .

IPython集成?

PyOpenCL附帶IPython集成,它允許您將PyOpenCL內核無縫集成到IPython筆記本中。只需使用以下命令加載PyOpenCL IPython擴展:

%load_ext pyopencl.ipython_ext

然后使用 %%cl_kernel “細胞魔法”命令??吹搅藛?this notebook (與PyOpenCL一起提供)進行演示。

您可以通過使用 -o 單元格第一行上的標志(位于 %%cl_kernel 指令)。例如: %%cl_kernel -o "-cl-fast-relaxed-math" '.

還有線條魔術: cl_load_edit_kernel 將文件加載到下一個單元格(添加 cl_kernel 到第一行)和 cl_kernel_from_file 它將編譯一個文件的內核(就好像你將文件的內容復制并粘貼到一個帶有 cl_kernel ). 這兩種魔法都有選擇 -f 指定文件和 -o 用于生成選項。

2014.1 新版功能.

指南?

API穩定性?

我認為PyOpenCL的API是“穩定的”。但這并不意味著它不能改變。但如果這樣做了,您的代碼通常會繼續運行。不過,它可能會開始對您需要更改的內容發出警告,以保持與未來版本的兼容性。

如發布名稱中的第一個數字所示,棄用警告將持續一整年。(“2014.1”中的“2014”),即2014.n中不推薦使用的函數通常將在2015.n(或更高版本)中刪除。此外,穩定性承諾適用于作為已發布版本一部分的任何代碼。它不適用于API的未記錄位,也不適用于從git下載的未發布代碼。

與OpenCL的C綁定的關系?

在將OpenCL的C接口綁定到Python時,我們嘗試遵循以下準則:

  • 移除 cl_ , CL_cl 數據類型、宏和函數名的前綴。

  • 跟隨 PEP 8 ,即

    • 使函數名小寫。

    • 如果數據類型或函數名由多個單詞組成,請用下劃線分隔這些單詞。

  • get_info 函數變成屬性。

  • 對象創建盡可能由構造函數完成。(即盡量減少使用“工廠功能”)

  • 如果一個操作涉及兩個或多個“復雜”對象(例如,一個內核排隊涉及一個內核和一個隊列),請拒絕猜測哪一個應該得到該操作的方法的誘惑。相反,只需將該命令保留為函數即可。

與其他OpenCL軟件的互操作性?

幾乎所有的東西 pyopencl 支持以下接口(此處顯示為 pyopencl.MemoryObject ,從中 pyopencl.Bufferpyopencl.Image 繼承):

這允許將指向OpenCL對象的C級指針檢索為Python整數,然后可以將其傳遞給接口公開OpenCL對象的其他C庫。它還允許將從其他軟件獲得的C級OpenCL對象轉換為相應的 pyopencl 物體。

2013.2 新版功能.

用戶可見的更改?

版本2020.3?

注解

此版本目前正在開發中。你可以從PyOpenCL的 git repository

版本2020.2?

  • 刪除python2支持。

  • 添加 allow_empty_ndrange 內核排隊。

  • 錯誤修復。

版本2018.2?

  • 使用pybind11。

  • 許多錯誤修復。

  • 支持掃描內核中帶有偏移量的數組。

版本2018.1?

  • 介紹 eliminate_empty_output_lists 的參數 pyopencl.algorithm.ListOfListsBuilder .

  • 許多錯誤修復。

2017.2版?

  • 許多錯誤修復。

2017.1版?

2016.2版?

2016.1版?

  • 這個 from_int_ptr 方法現在需要 保持 更方便所有權管理的參數。

  • 內核構建選項(如果作為列表傳遞)現在被正確引用。(這可能會破壞兼容性。)

  • 許多錯誤修復。(GL interop、Windows、事件回調等)

版本2015.2.4?

  • 使用mingwpy和vs2015修復Windows上的構建。

版本2015.2.3?

  • 再修復一個ubuntu14.x版本問題。

版本2015.2.2?

  • 修復與第1.1條的兼容性

  • 修復與Ubuntu 14.x的兼容性。

  • 各種錯誤修復

版本2015.2.1?

  • 修正全局內核啟動參數

2015.2版?

  • [[INCOMPATIBLE]] 將PyOpenCL的復數從 float2double2 要自定義的OpenCL矢量類型 struct . 這是改變了,因為它很容易引入錯誤的地方

    • 復雜*復雜

    • 真實+復雜

    look 就像他們做了正確的事,卻默默地做了錯誤的事。

  • 基于CFFI重寫包裝層

  • Pypy兼容性

  • 通過Python啟動程序代碼生成更快的內核調用

  • POCL兼容性

2015.1版?

  • 支持新型緩沖協議

  • 大量修復

2014.1版?

版本2013.2?

2013.1版?

注解

增加 pyopencl.array.Array.__getitem__() 由于 numpy bug 3375 . 例如,這個表達式:

numpy.float32(5) * some_pyopencl_array

可能需要很長時間才能執行。這是因為 numpy 首先構建(計算設備)標量(?。┑膶ο髷到M在它決定這可能不是個好主意并最終打電話給 pyopencl.array.Array.__rmul__ .

注意,只剩下 pyopencl.array.Array 通過 numpy 鱗片受到影響。python的數字類型 (float 不受影響,正確的乘法也不受影響。

如果一個曾經運行得很快的程序突然運行得非常慢,很可能是這個錯誤造成的。

這就是你能做的:

  • 使用python標量而不是 numpy 標量。

  • 如果可能的話,切換到右邊的乘法。

  • 使用補丁 numpy . 請參閱上面鏈接的bug報告,以獲取帶有修復的pull請求。

  • 切換到的固定版本 numpy 何時可用。

2012.1版?

  • 支持復數。

  • 支持貝塞爾函數。(實驗性)

  • 大量修復。

版本2011.2?

版本2011.1.2?

  • 更多錯誤修復。

版本2011.1.1?

  • 修復了python3兼容性。(作者:克里斯托夫·高爾克)

版本2011.1?

版本0.92?

版本0.91.5?

版本0.91.4?

一個錯誤修復版本。沒有用戶可見的更改。

版本0.91.3?

  • 所有參數都命名為 host_buffer 已重命名 霍斯特布夫 為了與 pyopencl.Buffer 0.91中引入的構造函數。兼容性代碼已就位。

  • 這個 pyopencl.Image 構造函數不需要 形狀 參數,如果給定 霍斯特布夫hostbuf.shape .

  • 這個 pyopencl.Context 構造函數現在可以在沒有參數的情況下調用。

版本0.91.2?

版本0.91.1?

版本0.91?

版本0.90.4?

  • 為Windows和OS X添加生成修復程序。

版本0.90.3?

  • 將GNU ISM固定在包裝器的C++代碼中。

版本0.90.2?

版本0.90.1?

  • 在Mac上修復建筑。

版本0.90?

  • 首次發布。

許可?

PyOpenCL根據MIT/X聯盟許可證授權給您:

版權所有(c)2009-13 Andreas Kl?ckner和貢獻者。

特此免費授予任何獲得本軟件及其相關文檔文件(以下簡稱“本軟件”)副本的人,允許其在不受限制的情況下處理本軟件,包括但不限于使用、復制、修改、合并、發布、分發、再許可和/或出售本軟件副本的權利,并允許他人向其提供軟件的國家或地區,但須符合以下條件:

上述版權聲明和本許可聲明應包含在軟件的所有副本或實質部分中。

本軟件按“原樣”提供,不作任何明示或暗示的保證,包括但不限于對適銷性、特定用途適用性和非侵權性的保證。在任何情況下,無論是在合同訴訟、侵權訴訟或其他訴訟中,作者或版權持有人均不承擔因本軟件或本軟件的使用或其他交易而產生、引起或與之相關的任何索賠、損害或其他責任。

PyOpenCL包括 Thrust 計算包(特別是掃描實現)。這些零件的許可證如下:

版權所有2008-2011英偉達公司

根據Apache許可證2.0版(“許可證”)獲得許可;除非符合許可證,否則不得使用此文件。您可以在以下網址獲得許可證副本:

除非適用法律要求或書面同意,否則根據許可證分發的軟件按“原樣”分發,不提供任何形式的明示或暗示保證或條件。請參閱許可證,了解許可證下管理權限和限制的特定語言。

注解

如果您使用apache許可的部件,請注意這些部件可能與gpl2下獨家許可的軟件不兼容。(大多數軟件被授權為GPL2或更高版本,在這種情況下這不是問題。)

PyOpenCL包括Random123隨機數生成器套件的一部分:

版權所有2010-2012,D.E.Shaw Research。版權所有。

只要滿足以下條件,允許以源形式和二進制形式重新分配和使用,不論是否修改:

  • 重新分發源代碼必須保留上述版權聲明、此條件列表和以下免責聲明。

  • 以二進制形式重新分發時,必須在分發時提供的文檔和/或其他材料中復制上述版權聲明、此條件列表以及以下免責聲明。

  • 未經事先書面許可,不得使用D.E.Shaw Research的名稱或其貢獻者的姓名來認可或推廣從本軟件衍生的產品。

本軟件由版權所有人和貢獻者“按原樣”提供,任何明示或暗示的保證,包括但不限于對適銷性和特定用途適用性的暗示保證,均不予承認。在任何情況下,版權所有人或貢獻者均不對任何直接、間接、偶然、特殊、懲戒性或后果性損害(包括但不限于采購替代貨物或服務;使用、數據或利潤損失;或業務中斷)負責,無論該損害是由何種原因引起的,還是根據任何責任理論,無論是在合同中,因使用本軟件而產生的嚴格責任或侵權(包括疏忽或其他),即使已告知可能造成此類損害。

PyOpenCL包括RANLUXCL隨機數生成器:

版權所有(c)2011 Ivar Ursin Nikolaisen

特此免費授予任何獲得本軟件及其相關文檔文件(以下簡稱“本軟件”)副本的人,允許其在不受限制的情況下處理本軟件,包括但不限于使用、復制、修改、合并、發布、分發、再許可和/或出售本軟件副本的權利,并允許他人向其提供軟件的國家或地區,但須符合以下條件:

上述版權聲明和本許可聲明應包含在軟件的所有副本或實質部分中。

本軟件按“原樣”提供,不作任何明示或暗示的保證,包括但不限于對適銷性、特定用途適用性和非侵權性的保證。在任何情況下,無論是在合同訴訟、侵權訴訟或其他訴訟中,作者或版權持有人均不承擔因本軟件或本軟件的使用或其他交易而產生、引起或與之相關的任何索賠、損害或其他責任。

常見問題?

FAQ以協作方式維護在 Wiki FAQ page .

引用PyOpenCL?

我們并不是要你在與軟件無關的工作中無緣無故地引用PyOpenCL。也就是說,如果您確實討論了代碼的一些開發方面,并且希望強調PyOpenCL背后的一些想法,請隨意引用 this article

Andreas Klóckner、Nicolas Pinto、Yunsup Lee、Bryan Catanzaro、Paul Ivanov、Ahmed Fasih、Pycuda和PyOpenCl:基于腳本的GPU運行時代碼生成方法,并行計算,第38卷,第3期,2012年3月,第157-174頁。

為了您的方便,這里有一個bibtex條目:

@article{kloeckner_pycuda_2012,
   author = {{Kl{\"o}ckner}, Andreas
        and {Pinto}, Nicolas
        and {Lee}, Yunsup
        and {Catanzaro}, B.
        and {Ivanov}, Paul
        and {Fasih}, Ahmed },
   title = "{PyCUDA and PyOpenCL: A Scripting-Based Approach to GPU Run-Time Code Generation}",
   journal = "Parallel Computing",
   volume = "38",
   number = "3",
   pages = "157--174",
   year = "2012",
   issn = "0167-8191",
   doi = "10.1016/j.parco.2011.09.001",
}

致謝?

貢獻者?

太多,無法列出。請看照片 commit log 詳細的致謝。

基金?

Andreas Kl?ckner關于 pyopencl 部分支持

  • 美國海軍ONR授權號N00014-14-1-0117

  • 美國國家科學基金會,授權號DMS-1418961和CCF-1524433。

AK也非常感謝Nvidia公司贈送的硬件。此處表達的觀點和意見不一定反映資助機構的觀點和意見。

文件交叉引用?

Numpy?

class numpy.int8?

numpy.generic .

class numpy.int32?

numpy.generic .

class numpy.float64?

numpy.generic .

OpenCL規范?

type cl_platform_id?

CL specification .

type cl_device_id?

CL specification .

type cl_context?

CL specification .

type cl_command_queue?

CL specification .

type cl_mem?

CL specification .

type cl_program?

CL specification .

type cl_kernel?

CL specification .

type cl_sampler?

CL specification .

type cl_event?

CL specification .

void clCreateCommandQueueWithProperties()?

CL specification .

void clCreateSamplerWithProperties()?

CL specification .

void clCreatePipe()?

CL specification .

內部類型?

class pyopencl._cl.Platform?

pyopencl.Platform .

class pyopencl._cl.Device?

pyopencl.Device .

class pyopencl._cl.CommandQueue?

pyopencl.CommandQueue .

class pyopencl._cl.Context?

pyopencl.Context .

class pyopencl._cl.Event?

pyopencl.Event .

class pyopencl._cl.SVMAllocation?

pyopencl.SVMAllocation .

class pyopencl._cl.MemoryMap?

pyopencl.MemoryMap .

class pyopencl._cl.Sampler?

pyopencl.Sampler .

class pyopencl._cl.Program?

pyopencl.Program .

class pyopencl._cl._Program?

pyopencl.Program .

class pyopencl._cl.Kernel?

pyopencl.Kernel .