簡體   English   中英

啟用OpenCL后無法在Magick ++中使用GPU

[英]Can't use GPU in Magick++ after enabling OpenCL

我想在我的項目的Magick ++函數中使用GPU。 我已經使用教程(啟用OpenCL)構建了ImageMagick。 生成后的convert.exe文件說已啟用OpenCL。 我已經包含了必要的標頭和庫(CORE_RL_Magick ++ _。lib,CORE_RL_MagickCore_.lib,CORE_RL_MagickWand_.lib)。 我還設置了IMAGEMAGICK_OPENCL_CACHE_DIR系統變量和路徑(用於存儲必要的文件)。 我正在使用Windows和Visual Studio。
這是我的代碼:

...
#include <Magick++.h>
#include <MagickCore/MagickCore.h>
#include <MagickWand/MagickWand.h>
#include <MagickCore\accelerate-private.h>
...

using namespace Magick;

int main(int argc, char *argv[])
{
    EnableOpenCL();
    InitializeMagick(NULL);
    EnableOpenCL(); // Executed this after InitializeMagick too to be sure. Maybe it's needed to be executed after InitializeMagick().

    Image img;
    img.read("F:/tmp/test/22/7.png");

    // These two functions should use GPU. But they don't. :
    img.gaussianBlur(15, 3);
    img.edge();
}

該代碼沒有錯誤,但是如您所見,我的代碼具有ImageMagick可以在其中使用GPU的功能。 但事實並非如此。 它僅使用CPU。 另外,ImageMagick在IMAGEMAGICK_OPENCL_CACHE_DIR設置的路徑中不生成任何文件。
哪一部分錯了?

編輯:

C:\Users\User1>convert -version
Version: ImageMagick 7.0.8-4 Q16 x64 2018-06-29 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Visual C++: 190024210
Features: Cipher DPC HDRI Modules OpenCL OpenMP
Delegates (built-in): bzlib cairo flif freetype gslib heic jng jp2 jpeg lcms lqr lzma openexr pangocairo png ps raw rsvg tiff webp xml zlib

另外,我的GPU支持OpenCL。

更新的答案

如果設置MAGICK_OCL_DEVICE無效,和/或EnableOpenCl返回false ,則無法將OpenCL內核加載到目標平台/設備中。 ImageMagick的行為是發出DelegateWarning (不是錯誤),然后故障回復到CPU。

我懷疑是這種情況,那為什么會被記錄到文件中指定的原因magick_badcl_build.log失敗,而實際的OpenCL代碼被寫入magick_badcl.cl 這兩個文件都應發布到開發者論壇進行審查。

另外,環境變量應該是MAGICK_OPENCL_CACHE_DIR ,而不是IMAGEMAGICK_OPENCL_CACHE_DIR 我認為文檔是錯誤的。

從opencl.c

  home=GetEnvironmentValue("MAGICK_OPENCL_CACHE_DIR"); if (home == (char *) NULL) { home=GetEnvironmentValue("XDG_CACHE_HOME"); if (home == (char *) NULL) home=GetEnvironmentValue("LOCALAPPDATA"); if (home == (char *) NULL) home=GetEnvironmentValue("APPDATA"); if (home == (char *) NULL) home=GetEnvironmentValue("USERPROFILE"); } 

原始答案

使用方法InitImageMagickOpenCL來控制OpenCL設備管理,而不是EnableOpenCl (它將自動選擇最佳設備,並且最佳設備通常是CPU)來控制OpenCL。

cl_uint platformCount;
cl_platform_id platforms[4];
cl_uint deviceCount;
cl_device_id devices[8];
cl_device_id * user_selected_GPU = nullptr;
clGetPlatformIDs(4, platforms, &platformCount);
// Grap the first GPU off the first platform.
// !!! Check docs as this is a _very_ bad example. !!!
if (platformCount > 0) {
    clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_GPU, 8, devices, &deviceCount);
    if (deviceCount > 0) {
        user_selected_GPU = devices[0];
    }
}
if (user_selected_GPU) {
    MagickCore::ExceptionInfo * exception = MagickCore::AcquireExceptionInfo();
    MagickCore::InitImageMagickOpenCL(
          MagickCore::MAGICK_OPENCL_DEVICE_SELECT_USER,
          user_selected_GPU,
          nullptr,
          exception
    );
} else {
    // No GPU found... 
}

通常,您無需費心定義要在哪個設備上運行,因為ImageMagick將獲取系統和環境信息。 例如,在我的Mac上,將始終從設備池中選擇CPU。 如果我想直接使用GPU,則可以在運行時使用環境變量定義它。

 MAGICK_OCL_DEVICE=GPU ./my_opencl_enabled_magick_application

暫無
暫無

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

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