簡體   English   中英

oneMKL 無法通過 openmp 卸載

[英]oneMKL can not offload by openmp

我嘗試運行OneAPI示例中的官方代碼,發現下面的代碼實際上並沒有在GPU上運行。

#pragma omp target data map(to:a[0:sizea],b[0:sizeb]) map(tofrom:c[0:sizec]) device(dnum)
{
    // run gemm on gpu, use standard oneMKL interface within a variant dispatch construc
    #pragma omp target variant dispatch device(dnum) use_device_ptr(a, b, c)
    {
        cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc);
    }
}

因為通過export LIBOMPTARGET_PLUGIN_PROFILE=T我發現程序運行時沒有 kernel 時間,像這樣:在此處輸入圖像描述

通過export MKL_VERBOSE=1我發現 MKL function 在 GPU 上運行了 0 次。例如:在此處輸入圖像描述

我想知道是什么問題以及有什么解決辦法,我的Linux平台使用Intel的GPU Intel(R) Graphics.thanks

cblas_zgemm是一個 BLAS function 調用,OpenMP 並不打算重寫它以便使用它自己的基於 GPU 的實現。 畢竟,從 OpenMP 的角度來看,這只是一個函數調用。 問題是,如果鏈接的 BLAS 實現不是為在 GPU 上運行而設計的,那么 OpenMP 將不會自動將(編譯的)代碼轉換為 GPU(到目前為止還沒有這樣的工具,因為 Z52F9EC21735243AD9917CDA3CA07 的工作方式與 CPU 非常不同)。 因此,如果 BLAS 不打算使用 GPU,則 OpenMP 無法在 GPU 上運行它。

OneAPI 文檔提到了使用 OpenMP 和 BLAS 進行 GPU 卸載,但在單獨/獨立的點。 目前尚不清楚 OneMKL 是否有基於 GPU 的版本。 AFAIK,它在 OpenMP 程序中不可用,但可能來自SysCL/DPC++ 代碼,但我不確定它是否支持 iGPU。

最后,即使您可以這樣做,它在您的目標硬件上也不會有效。 像主流 PC GPU(即客戶端)這樣的英特爾 iGPU 並不是為快速計算雙精度運算而設計的:只有單精度運算。 這是因為它們是為 3D 渲染和 2D 加速而設計的,其中單精度就足夠了,而且單精度單位消耗的功率遠低於雙精度(每秒計算相同數量的項目)。 這意味着cblas_zgemm調用在你的 CPU 上肯定會比在你的 iGPU 上快得多(假設它是可能的)。

Intel oneMKL 確實支持在 CPU 和 GPU 上運行,如此處文檔中所述:

https://www.intel.com/content/www/us/en/develop/documentation/get-started-with-mkl-for-dpcpp/top.html

但是 cblas 調用是僅在 CPU 上運行的 C 調用(實際上構建在 Fortran 實現之上)。

您應該能夠在 OpenMP 中毫無問題地進行 oneMKL 調用,但正如另一個答案所暗示的那樣,這只會並行運行調用,而不會影響代碼所針對的設備。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM