mirror of https://github.com/emgucv/emgucv.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
7.0 KiB
232 lines
7.0 KiB
//----------------------------------------------------------------------------
|
|
// Copyright (C) 2004-2019 by EMGU Corporation. All rights reserved.
|
|
//----------------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using Emgu.Util;
|
|
|
|
namespace Emgu.CV.Cuda
|
|
{
|
|
/// <summary>
|
|
/// The Cuda device information
|
|
/// </summary>
|
|
public class CudaDeviceInfo : UnmanagedObject
|
|
{
|
|
private int _deviceID;
|
|
|
|
/// <summary>
|
|
/// Query the information of the gpu device that is currently in use.
|
|
/// </summary>
|
|
public CudaDeviceInfo()
|
|
: this(CudaInvoke.GetDevice())
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Query the information of the cuda device with the specific id.
|
|
/// </summary>
|
|
/// <param name="deviceId">The device id</param>
|
|
public CudaDeviceInfo(int deviceId)
|
|
{
|
|
_ptr = CudaInvoke.cudaDeviceInfoCreate(ref deviceId);
|
|
_deviceID = deviceId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The id of the device
|
|
/// </summary>
|
|
public int ID
|
|
{
|
|
get { return _deviceID; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// The name of the device
|
|
/// </summary>
|
|
public String Name
|
|
{
|
|
get
|
|
{
|
|
StringBuilder buffer = new StringBuilder(1024);
|
|
CudaInvoke.cudaDeviceInfoDeviceName(_ptr, buffer, 1024);
|
|
return buffer.ToString();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// The compute capability
|
|
/// </summary>
|
|
public Version CudaComputeCapability
|
|
{
|
|
get
|
|
{
|
|
int major = 0, minor = 0;
|
|
CudaInvoke.cudaDeviceInfoComputeCapability(_ptr, ref major, ref minor);
|
|
return new Version(major, minor);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// The number of single multi processors
|
|
/// </summary>
|
|
public int MultiProcessorCount
|
|
{
|
|
get
|
|
{
|
|
return CudaInvoke.cudaDeviceInfoMultiProcessorCount(_ptr);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the amount of free memory at the moment
|
|
/// </summary>
|
|
public ulong FreeMemory
|
|
{
|
|
get
|
|
{
|
|
UIntPtr f = new UIntPtr();
|
|
CudaInvoke.cudaDeviceInfoFreeMemInfo(_ptr, ref f);
|
|
return f.ToUInt64();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the amount of total memory
|
|
/// </summary>
|
|
public ulong TotalMemory
|
|
{
|
|
get
|
|
{
|
|
UIntPtr t = new UIntPtr();
|
|
CudaInvoke.cudaDeviceInfoTotalMemInfo(_ptr, ref t);
|
|
return t.ToUInt64();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Indicates if the device has the specific feature
|
|
/// </summary>
|
|
/// <param name="feature">The device feature</param>
|
|
/// <returns>True if the feature is supported</returns>
|
|
public bool Supports(GpuFeature feature)
|
|
{
|
|
return CudaInvoke.cudaDeviceInfoSupports(_ptr, feature);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Checks whether the Cuda module can be run on the given device
|
|
/// </summary>
|
|
public bool IsCompatible
|
|
{
|
|
get
|
|
{
|
|
return CudaInvoke.cudaDeviceInfoIsCompatible(_ptr);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// GPU feature
|
|
/// </summary>
|
|
public enum GpuFeature
|
|
{
|
|
/// <summary>
|
|
/// Cuda compute 1.0
|
|
/// </summary>
|
|
Compute10 = 10,
|
|
/// <summary>
|
|
/// Cuda compute 1.1
|
|
/// </summary>
|
|
Compute11 = 11,
|
|
/// <summary>
|
|
/// Cuda compute 1.2
|
|
/// </summary>
|
|
Compute12 = 12,
|
|
/// <summary>
|
|
/// Cuda compute 1.3
|
|
/// </summary>
|
|
Compute13 = 13,
|
|
/// <summary>
|
|
/// Cuda compute 2.0
|
|
/// </summary>
|
|
Compute20 = 20,
|
|
/// <summary>
|
|
/// Cuda compute 2.1
|
|
/// </summary>
|
|
Compute21 = 21,
|
|
|
|
/// <summary>
|
|
/// Global Atomic
|
|
/// </summary>
|
|
GlobalAtomics = Compute11,
|
|
/// <summary>
|
|
/// Shared Atomic
|
|
/// </summary>
|
|
SharedAtomics = Compute12,
|
|
/// <summary>
|
|
/// Native double
|
|
/// </summary>
|
|
NativeDouble = Compute13,
|
|
}
|
|
|
|
/// <summary>
|
|
/// Release the unmanaged resource related to the GpuDevice
|
|
/// </summary>
|
|
protected override void DisposeObject()
|
|
{
|
|
CudaInvoke.cudaDeviceInfoRelease(ref _ptr);
|
|
}
|
|
}
|
|
|
|
public static partial class CudaInvoke
|
|
{
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal extern static IntPtr cudaDeviceInfoCreate(ref int deviceId);
|
|
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal extern static void cudaDeviceInfoRelease(ref IntPtr di);
|
|
|
|
/// <summary>
|
|
/// Get the compute capability of the device
|
|
/// </summary>
|
|
/// <param name="device">The device</param>
|
|
/// <param name="major">The major version of the compute capability</param>
|
|
/// <param name="minor">The minor version of the compute capability</param>
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern void cudaDeviceInfoComputeCapability(IntPtr device, ref int major, ref int minor);
|
|
|
|
/// <summary>
|
|
/// Get the number of multiprocessors on device
|
|
/// </summary>
|
|
/// <param name="device">The device</param>
|
|
/// <returns>The number of multiprocessors on device</returns>
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern int cudaDeviceInfoMultiProcessorCount(IntPtr device);
|
|
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern void cudaDeviceInfoFreeMemInfo(IntPtr device, ref UIntPtr free);
|
|
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern void cudaDeviceInfoTotalMemInfo(IntPtr device, ref UIntPtr total);
|
|
|
|
/// <summary>
|
|
/// Get the device name
|
|
/// </summary>
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
internal static extern void cudaDeviceInfoDeviceName(
|
|
IntPtr device,
|
|
[MarshalAs(CvInvoke.StringMarshalType)]
|
|
StringBuilder buffer,
|
|
int maxSizeInBytes);
|
|
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
[return: MarshalAs(CvInvoke.BoolMarshalType)]
|
|
internal static extern bool cudaDeviceInfoSupports(IntPtr device, CudaDeviceInfo.GpuFeature feature);
|
|
|
|
[DllImport(CvInvoke.ExternCudaLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
|
|
[return: MarshalAs(CvInvoke.BoolMarshalType)]
|
|
internal static extern bool cudaDeviceInfoIsCompatible(IntPtr device);
|
|
}
|
|
}
|