Почему я получаю ошибки при вызове библиотеки opencl из mono в Linux? - PullRequest
0 голосов
/ 18 сентября 2018

Я получаю сообщение об ошибке «ссылка на объект не установлена ​​для экземпляра объекта», вызывающая библиотеку opencl из mono в Ubuntu Linux.

Окружающая среда:Ubuntu Linux 16.04GeForce GTX 960пакеты:OCL-ИКД-OpenCL-DEVNVIDIA-OpenCL-ИКД-384OpenCL-заголовкиclinfoмоно-полной

создал символическую ссылку для libOpenCL.so в / usr / lib из / usr / lib / x86_64-linux-gnu, так как он, кажется, не находится на пути моно.

clinfo видитплатформа и, кажется, выдает правильные данные для карты.

Код выглядит следующим образом:

using cl_int = Int32;
using cl_uint = UInt32;
using cl_platform_id = IntPtr;

class Program
{
    [DllImport("OpenCL.dll")]
    public extern static cl_int clGetPlatformIDs(cl_uint num_entries, [Out] [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] cl_platform_id[] platforms, out cl_uint num_platforms);

    static void Main(string[] args)
    {
        System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
        try
        {
            IntPtr[] platformIDs=null;
            cl_int result=0;
            cl_uint returnedPlatforms=0;

            Console.WriteLine("call");
            // determine how many platforms are available - call based in chronos docs.
            // running with MONO_LOG_LEVEL=debug and MONO_LOG_MASK=dll shows the dll is found
            // abends with 'object reference not set to an instance of an object'
            result = (cl_int)clGetPlatformIDs(0, null, out returnedPlatforms); 
            Console.WriteLine(string.Format("ERR: {0} Platforms {1}", returnedPlatforms, result));
        }    
        catch (Exception ex)
        {
            Console.WriteLine("Oops");
            string stack = null;
            StringBuilder sb = new StringBuilder();
            while (ex != null)
            {
                sb.AppendLine(ex.Message);
                if (ex.StackTrace != null && stack == null)
                {
                    stack = ex.StackTrace;
                }
                ex = ex.InnerException;
            }
            if (stack != null)
                sb.AppendLine(stack);
            Console.WriteLine(sb.ToString());
        }
        Console.WriteLine("End");
    }

    static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("Oops deep");
        Console.WriteLine(e.ExceptionObject.ToString());
    }   
}

Выполнение с моно отладкой, установленной в коде, приводит к:

call
Oops
Object reference not set to an instance of an object
at (wrapper managed-to-native) TestOCL.Program:clGetPlatformIDs (uint,intptr[],uint&)
at TestOCL.Program.Main (System.String[] args) <0x40740d60 + 0x000c7> in <filename unknown>:0 

End
Mono: DllImport attempting to load: 'OpenCL.dll'.
Mono: DllImport error loading library 
'/home/oxygen/configuration/libOpenCL.dll': 
'/home/oxygen/configuration/libOpenCL.dll: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/home/oxygen/configuration/libOpenCL.dll.so': '/home/oxygen/configuration/libOpenCL.dll.so: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/usr/lib/libOpenCL.dll': '/usr/lib/libOpenCL.dll: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/usr/lib/libOpenCL.dll.so': '/usr/lib/libOpenCL.dll.so: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library 'libOpenCL.dll': 'libOpenCL.dll: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library 'libOpenCL.dll.so': 'libOpenCL.dll.so: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library 'OpenCL.dll': 'OpenCL.dll: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/home/oxygen/configuration/libOpenCL': '/home/oxygen/configuration/libOpenCL: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/home/oxygen/configuration/libOpenCL.so': '/home/oxygen/configuration/libOpenCL.so: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/usr/lib/libOpenCL': '/usr/lib/libOpenCL: cannot open shared object file: No such file or directory'.
Mono: DllImport loaded library '/usr/lib/libOpenCL.so'.
Mono: DllImport searching in: 'OpenCL.dll' ('/usr/lib/libOpenCL.so').
Mono: Searching for 'clGetPlatformIDs'.
Mono: Probing 'clGetPlatformIDs'.
Mono: Found as 'clGetPlatformIDs'.

'Ссылка на объект, не установленная для экземпляра объекта', перехватывается при обычной обработке исключений.

Вызов пытается узнать количество доступных платформ и следует документации Khronos.

Я не могу найти причину, по которой он не работает, и не могу найти ссылок на подобную проблему.,Может кто-нибудь, пожалуйста, укажите направление / решение?

...