public HuForceDirectedLayout(int steps)
        {
            #if !DEBUG
            try
            {
            #endif
                CUDADriver.cuInit(0);

                dev = new CUdevice();
                CUDADriver.cuDeviceGet(ref dev, 0);

                ctx = new CUcontext();
                CUDADriver.cuCtxCreate(ref ctx, 0, dev);

                mod = new CUmodule();
                CUDADriver.cuModuleLoad(ref mod, "BarnesHut.cubin");

                prop = new CUDeviceProperties();
                CUDADriver.cuDeviceGetProperties(ref prop, dev);
                int version = 0;
                CUDADriver.cuDriverGetVersion(ref version);

                string caps = "";

                GASS.CUDA.CUDARuntime.cudaRuntimeGetVersion(ref version);

                caps += "\tClock rate        = " + prop.clockRate/1000000 + " MHz\n";
                caps += "\tMemory size       = " + prop.totalConstantMemory/1024 + " KB\n";
                caps += "\tThreads per block = " + prop.maxThreadsPerBlock + "\n";
                caps += "\tWarp size         = " + prop.SIMDWidth + "\n";
                caps += "\tCUDA version      = " + version + "\n";

                Logger.AddMessage(LogEntryType.Info, "Successfully initialized CUDA GPU computation\n"+caps);
            #if !DEBUG
            }
            catch(Exception ex)
            {
                Logger.AddMessage(LogEntryType.Warning, "CUDA not available, falling back to CPU. Exception was: " + ex.Message);
                CUDAEnabled = false;
            }
            #endif
        }
 public static extern CUResult cuDeviceGetProperties(ref CUDeviceProperties prop, CUdevice dev);