Initial commit
Version 3.3 of the client
This commit is contained in:
83
src/com/sheepit/client/hardware/cpu/CPU.java
Normal file
83
src/com/sheepit/client/hardware/cpu/CPU.java
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 Laurent CLOUET
|
||||
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; version 2
|
||||
* of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package com.sheepit.client.hardware.cpu;
|
||||
|
||||
public class CPU {
|
||||
private String name;
|
||||
private String model;
|
||||
private String family;
|
||||
private String arch; // 32 or 64 bits
|
||||
|
||||
public CPU() {
|
||||
this.name = null;
|
||||
this.model = null;
|
||||
this.family = null;
|
||||
this.generateArch();
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public String model() {
|
||||
return this.model;
|
||||
}
|
||||
|
||||
public String family() {
|
||||
return this.family;
|
||||
}
|
||||
|
||||
public String arch() {
|
||||
return this.arch;
|
||||
}
|
||||
|
||||
public int cores() {
|
||||
return Runtime.getRuntime().availableProcessors();
|
||||
}
|
||||
|
||||
public void setName(String name_) {
|
||||
this.name = name_;
|
||||
}
|
||||
|
||||
public void setModel(String model_) {
|
||||
this.model = model_;
|
||||
}
|
||||
|
||||
public void setFamily(String family_) {
|
||||
this.family = family_;
|
||||
}
|
||||
|
||||
public void setArch(String arch_) {
|
||||
this.arch = arch_;
|
||||
}
|
||||
|
||||
public void generateArch() {
|
||||
String arch = System.getProperty("os.arch").toLowerCase();
|
||||
if (arch.equals("i386") || arch.equals("i686") || arch.equals("x86")) {
|
||||
this.arch = "32bit";
|
||||
}
|
||||
else if (arch.equals("amd64") || arch.equals("x86_64")) {
|
||||
this.arch = "64bit";
|
||||
}
|
||||
else {
|
||||
this.arch = "xxbit";
|
||||
}
|
||||
}
|
||||
}
|
||||
36
src/com/sheepit/client/hardware/gpu/CUDA.java
Normal file
36
src/com/sheepit/client/hardware/gpu/CUDA.java
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (C) 2013-2014 Laurent CLOUET
|
||||
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; version 2
|
||||
* of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package com.sheepit.client.hardware.gpu;
|
||||
|
||||
import com.sun.jna.Library;
|
||||
import com.sun.jna.NativeLong;
|
||||
|
||||
public interface CUDA extends Library {
|
||||
public int cuInit(int flags);
|
||||
|
||||
/*
|
||||
* @return: CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE
|
||||
*/
|
||||
public int cuDeviceGetCount(int count[]);
|
||||
|
||||
public int cuDeviceGetName(byte[] name, int len, int dev);
|
||||
|
||||
public int cuDeviceTotalMem(NativeLong bytes[], int dev);
|
||||
}
|
||||
508
src/com/sheepit/client/hardware/gpu/CUresult.java
Normal file
508
src/com/sheepit/client/hardware/gpu/CUresult.java
Normal file
@@ -0,0 +1,508 @@
|
||||
/*
|
||||
* JCuda - Java bindings for NVIDIA CUDA driver and runtime API
|
||||
*
|
||||
* Copyright (c) 2009-2012 Marco Hutter - http://www.jcuda.org
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
//package jcuda.driver;
|
||||
package com.sheepit.client.hardware.gpu;
|
||||
|
||||
/**
|
||||
* Error codes.<br />
|
||||
* <br />
|
||||
* Most comments are taken from the CUDA reference manual.
|
||||
*/
|
||||
public class CUresult {
|
||||
/**
|
||||
* The API call returned with no errors. In the case of query calls, this
|
||||
* can also mean that the operation being queried is complete (see
|
||||
* ::cuEventQuery() and ::cuStreamQuery()).
|
||||
*/
|
||||
public static final int CUDA_SUCCESS = 0;
|
||||
|
||||
/**
|
||||
* This indicates that one or more of the parameters passed to the API call
|
||||
* is not within an acceptable range of values.
|
||||
*/
|
||||
public static final int CUDA_ERROR_INVALID_VALUE = 1;
|
||||
|
||||
/**
|
||||
* The API call failed because it was unable to allocate enough memory to
|
||||
* perform the requested operation.
|
||||
*/
|
||||
public static final int CUDA_ERROR_OUT_OF_MEMORY = 2;
|
||||
|
||||
/**
|
||||
* This indicates that the CUDA driver has not been initialized with
|
||||
* ::cuInit() or that initialization has failed.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_INITIALIZED = 3;
|
||||
|
||||
/**
|
||||
* This indicates that the CUDA driver is in the process of shutting down.
|
||||
*/
|
||||
public static final int CUDA_ERROR_DEINITIALIZED = 4;
|
||||
|
||||
/**
|
||||
* This indicates profiling APIs are called while application is running
|
||||
* in visual profiler mode.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PROFILER_DISABLED = 5;
|
||||
|
||||
/**
|
||||
* This indicates profiling has not been initialized for this context.
|
||||
* Call cuProfilerInitialize() to resolve this.
|
||||
* @deprecated This error return is deprecated as of CUDA 5.0.
|
||||
* It is no longer an error to attempt to enable/disable the
|
||||
* profiling via ::cuProfilerStart or ::cuProfilerStop without
|
||||
* initialization.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PROFILER_NOT_INITIALIZED = 6;
|
||||
|
||||
/**
|
||||
* This indicates profiler has already been started and probably
|
||||
* cuProfilerStart() is incorrectly called.
|
||||
* @deprecated This error return is deprecated as of CUDA 5.0.
|
||||
* It is no longer an error to call cuProfilerStart() when
|
||||
* profiling is already enabled.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PROFILER_ALREADY_STARTED = 7;
|
||||
|
||||
/**
|
||||
* This indicates profiler has already been stopped and probably
|
||||
* cuProfilerStop() is incorrectly called.
|
||||
* @deprecated This error return is deprecated as of CUDA 5.0.
|
||||
* It is no longer an error to call cuProfilerStop() when
|
||||
* profiling is already disabled.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PROFILER_ALREADY_STOPPED = 8;
|
||||
|
||||
/**
|
||||
* This indicates that no CUDA-capable devices were detected by the installed
|
||||
* CUDA driver.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NO_DEVICE = 100;
|
||||
|
||||
/**
|
||||
* This indicates that the device ordinal supplied by the user does not
|
||||
* correspond to a valid CUDA device.
|
||||
*/
|
||||
public static final int CUDA_ERROR_INVALID_DEVICE = 101;
|
||||
|
||||
/**
|
||||
* This indicates that the device kernel image is invalid. This can also
|
||||
* indicate an invalid CUDA module.
|
||||
*/
|
||||
public static final int CUDA_ERROR_INVALID_IMAGE = 200;
|
||||
|
||||
/**
|
||||
* This most frequently indicates that there is no context bound to the
|
||||
* current thread. This can also be returned if the context passed to an
|
||||
* API call is not a valid handle (such as a context that has had
|
||||
* ::cuCtxDestroy() invoked on it). This can also be returned if a user
|
||||
* mixes different API versions (i.e. 3010 context with 3020 API calls).
|
||||
* See ::cuCtxGetApiVersion() for more details.
|
||||
*/
|
||||
public static final int CUDA_ERROR_INVALID_CONTEXT = 201;
|
||||
|
||||
/**
|
||||
* This indicated that the context being supplied as a parameter to the
|
||||
* API call was already the active context.
|
||||
* \deprecated
|
||||
* This error return is deprecated as of CUDA 3.2. It is no longer an
|
||||
* error to attempt to push the active context via ::cuCtxPushCurrent().
|
||||
*/
|
||||
public static final int CUDA_ERROR_CONTEXT_ALREADY_CURRENT = 202;
|
||||
|
||||
/**
|
||||
* This indicates that a map or register operation has failed.
|
||||
*/
|
||||
public static final int CUDA_ERROR_MAP_FAILED = 205;
|
||||
|
||||
/**
|
||||
* This indicates that an unmap or unregister operation has failed.
|
||||
*/
|
||||
public static final int CUDA_ERROR_UNMAP_FAILED = 206;
|
||||
|
||||
/**
|
||||
* This indicates that the specified array is currently mapped and thus
|
||||
* cannot be destroyed.
|
||||
*/
|
||||
public static final int CUDA_ERROR_ARRAY_IS_MAPPED = 207;
|
||||
|
||||
/**
|
||||
* This indicates that the resource is already mapped.
|
||||
*/
|
||||
public static final int CUDA_ERROR_ALREADY_MAPPED = 208;
|
||||
|
||||
/**
|
||||
* This indicates that there is no kernel image available that is suitable
|
||||
* for the device. This can occur when a user specifies code generation
|
||||
* options for a particular CUDA source file that do not include the
|
||||
* corresponding device configuration.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NO_BINARY_FOR_GPU = 209;
|
||||
|
||||
/**
|
||||
* This indicates that a resource has already been acquired.
|
||||
*/
|
||||
public static final int CUDA_ERROR_ALREADY_ACQUIRED = 210;
|
||||
|
||||
/**
|
||||
* This indicates that a resource is not mapped.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_MAPPED = 211;
|
||||
|
||||
/**
|
||||
* This indicates that a mapped resource is not available for access as an
|
||||
* array.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_MAPPED_AS_ARRAY = 212;
|
||||
|
||||
/**
|
||||
* This indicates that a mapped resource is not available for access as a
|
||||
* pointer.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_MAPPED_AS_POINTER = 213;
|
||||
|
||||
/**
|
||||
* This indicates that an uncorrectable ECC error was detected during
|
||||
* execution.
|
||||
*/
|
||||
public static final int CUDA_ERROR_ECC_UNCORRECTABLE = 214;
|
||||
|
||||
/**
|
||||
* This indicates that the ::CUlimit passed to the API call is not
|
||||
* supported by the active device.
|
||||
*/
|
||||
public static final int CUDA_ERROR_UNSUPPORTED_LIMIT = 215;
|
||||
|
||||
/**
|
||||
* This indicates that the ::CUcontext passed to the API call can
|
||||
* only be bound to a single CPU thread at a time but is already
|
||||
* bound to a CPU thread.
|
||||
*/
|
||||
public static final int CUDA_ERROR_CONTEXT_ALREADY_IN_USE = 216;
|
||||
|
||||
/**
|
||||
* This indicates that peer access is not supported across the given
|
||||
* devices.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PEER_ACCESS_UNSUPPORTED = 217;
|
||||
|
||||
/**
|
||||
* This indicates that the device kernel source is invalid.
|
||||
*/
|
||||
public static final int CUDA_ERROR_INVALID_SOURCE = 300;
|
||||
|
||||
/**
|
||||
* This indicates that the file specified was not found.
|
||||
*/
|
||||
public static final int CUDA_ERROR_FILE_NOT_FOUND = 301;
|
||||
|
||||
/**
|
||||
* This indicates that a link to a shared object failed to resolve.
|
||||
*/
|
||||
public static final int CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND = 302;
|
||||
|
||||
/**
|
||||
* This indicates that initialization of a shared object failed.
|
||||
*/
|
||||
public static final int CUDA_ERROR_SHARED_OBJECT_INIT_FAILED = 303;
|
||||
|
||||
/**
|
||||
* This indicates that an OS call failed.
|
||||
*/
|
||||
public static final int CUDA_ERROR_OPERATING_SYSTEM = 304;
|
||||
|
||||
/**
|
||||
* This indicates that a resource handle passed to the API call was not
|
||||
* valid. Resource handles are opaque types like ::CUstream and ::CUevent.
|
||||
*/
|
||||
public static final int CUDA_ERROR_INVALID_HANDLE = 400;
|
||||
|
||||
/**
|
||||
* This indicates that a named symbol was not found. Examples of symbols
|
||||
* are global/constant variable names, texture names, and surface names.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_FOUND = 500;
|
||||
|
||||
/**
|
||||
* This indicates that asynchronous operations issued previously have not
|
||||
* completed yet. This result is not actually an error, but must be indicated
|
||||
* differently than ::CUDA_SUCCESS (which indicates completion). Calls that
|
||||
* may return this value include ::cuEventQuery() and ::cuStreamQuery().
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_READY = 600;
|
||||
|
||||
/**
|
||||
* An exception occurred on the device while executing a kernel. Common
|
||||
* causes include dereferencing an invalid device pointer and accessing
|
||||
* out of bounds shared memory. The context cannot be used, so it must
|
||||
* be destroyed (and a new one should be created). All existing device
|
||||
* memory allocations from this context are invalid and must be
|
||||
* reconstructed if the program is to continue using CUDA.
|
||||
*/
|
||||
public static final int CUDA_ERROR_LAUNCH_FAILED = 700;
|
||||
|
||||
/**
|
||||
* This indicates that a launch did not occur because it did not have
|
||||
* appropriate resources. This error usually indicates that the user has
|
||||
* attempted to pass too many arguments to the device kernel, or the
|
||||
* kernel launch specifies too many threads for the kernel's register
|
||||
* count. Passing arguments of the wrong size (i.e. a 64-bit pointer
|
||||
* when a 32-bit int is expected) is equivalent to passing too many
|
||||
* arguments and can also result in this error.
|
||||
*/
|
||||
public static final int CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES = 701;
|
||||
|
||||
/**
|
||||
* This indicates that the device kernel took too long to execute. This can
|
||||
* only occur if timeouts are enabled - see the device attribute
|
||||
* ::CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT for more information. The
|
||||
* context cannot be used (and must be destroyed similar to
|
||||
* ::CUDA_ERROR_LAUNCH_FAILED). All existing device memory allocations from
|
||||
* this context are invalid and must be reconstructed if the program is to
|
||||
* continue using CUDA.
|
||||
*/
|
||||
public static final int CUDA_ERROR_LAUNCH_TIMEOUT = 702;
|
||||
|
||||
/**
|
||||
* This error indicates a kernel launch that uses an incompatible texturing
|
||||
* mode.
|
||||
*/
|
||||
public static final int CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING = 703;
|
||||
|
||||
/**
|
||||
* This error indicates that a call to ::cuCtxEnablePeerAccess() is
|
||||
* trying to re-enable peer access to a context which has already
|
||||
* had peer access to it enabled.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED = 704;
|
||||
|
||||
/**
|
||||
* This error indicates that a call to ::cuMemPeerRegister is trying to
|
||||
* register memory from a context which has not had peer access
|
||||
* enabled yet via ::cuCtxEnablePeerAccess(), or that
|
||||
* ::cuCtxDisablePeerAccess() is trying to disable peer access
|
||||
* which has not been enabled yet.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PEER_ACCESS_NOT_ENABLED = 705;
|
||||
|
||||
/**
|
||||
* This error indicates that a call to ::cuMemPeerRegister is trying to
|
||||
* register already-registered memory.
|
||||
* @deprecated This value has been added in CUDA 4.0 RC,
|
||||
* and removed in CUDA 4.0 RC2
|
||||
*/
|
||||
public static final int CUDA_ERROR_PEER_MEMORY_ALREADY_REGISTERED = 706;
|
||||
|
||||
/**
|
||||
* This error indicates that a call to ::cuMemPeerUnregister is trying to
|
||||
* unregister memory that has not been registered.
|
||||
* @deprecated This value has been added in CUDA 4.0 RC,
|
||||
* and removed in CUDA 4.0 RC2
|
||||
*/
|
||||
public static final int CUDA_ERROR_PEER_MEMORY_NOT_REGISTERED = 707;
|
||||
|
||||
/**
|
||||
* This error indicates that ::cuCtxCreate was called with the flag
|
||||
* ::CU_CTX_PRIMARY on a device which already has initialized its
|
||||
* primary context.
|
||||
*/
|
||||
public static final int CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE = 708;
|
||||
|
||||
/**
|
||||
* This error indicates that the context current to the calling thread
|
||||
* has been destroyed using ::cuCtxDestroy, or is a primary context which
|
||||
* has not yet been initialized.
|
||||
*/
|
||||
public static final int CUDA_ERROR_CONTEXT_IS_DESTROYED = 709;
|
||||
|
||||
/**
|
||||
* A device-side assert triggered during kernel execution. The context
|
||||
* cannot be used anymore, and must be destroyed. All existing device
|
||||
* memory allocations from this context are invalid and must be
|
||||
* reconstructed if the program is to continue using CUDA.
|
||||
*/
|
||||
public static final int CUDA_ERROR_ASSERT = 710;
|
||||
|
||||
/**
|
||||
* This error indicates that the hardware resources required to enable
|
||||
* peer access have been exhausted for one or more of the devices
|
||||
* passed to ::cuCtxEnablePeerAccess().
|
||||
*/
|
||||
public static final int CUDA_ERROR_TOO_MANY_PEERS = 711;
|
||||
|
||||
/**
|
||||
* This error indicates that the memory range passed to ::cuMemHostRegister()
|
||||
* has already been registered.
|
||||
*/
|
||||
public static final int CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED = 712;
|
||||
|
||||
/**
|
||||
* This error indicates that the pointer passed to ::cuMemHostUnregister()
|
||||
* does not correspond to any currently registered memory region.
|
||||
*/
|
||||
public static final int CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED = 713;
|
||||
|
||||
/**
|
||||
* This error indicates that the attempted operation is not permitted.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_PERMITTED = 800;
|
||||
|
||||
/**
|
||||
* This error indicates that the attempted operation is not supported
|
||||
* on the current system or device.
|
||||
*/
|
||||
public static final int CUDA_ERROR_NOT_SUPPORTED = 801;
|
||||
|
||||
/**
|
||||
* This indicates that an unknown internal error has occurred.
|
||||
*/
|
||||
public static final int CUDA_ERROR_UNKNOWN = 999;
|
||||
|
||||
/**
|
||||
* Returns the String identifying the given CUresult
|
||||
*
|
||||
* @param result The CUresult value
|
||||
* @return The String identifying the given CUresult
|
||||
*/
|
||||
public static String stringFor(int result) {
|
||||
switch (result) {
|
||||
case CUDA_SUCCESS:
|
||||
return "CUDA_SUCCESS";
|
||||
case CUDA_ERROR_INVALID_VALUE:
|
||||
return "CUDA_ERROR_INVALID_VALUE";
|
||||
case CUDA_ERROR_OUT_OF_MEMORY:
|
||||
return "CUDA_ERROR_OUT_OF_MEMORY";
|
||||
case CUDA_ERROR_NOT_INITIALIZED:
|
||||
return "CUDA_ERROR_NOT_INITIALIZED";
|
||||
case CUDA_ERROR_DEINITIALIZED:
|
||||
return "CUDA_ERROR_DEINITIALIZED";
|
||||
case CUDA_ERROR_PROFILER_DISABLED:
|
||||
return "CUDA_ERROR_PROFILER_DISABLED";
|
||||
case CUDA_ERROR_PROFILER_NOT_INITIALIZED:
|
||||
return "CUDA_ERROR_PROFILER_NOT_INITIALIZED";
|
||||
case CUDA_ERROR_PROFILER_ALREADY_STARTED:
|
||||
return "CUDA_ERROR_PROFILER_ALREADY_STARTED";
|
||||
case CUDA_ERROR_PROFILER_ALREADY_STOPPED:
|
||||
return "CUDA_ERROR_PROFILER_ALREADY_STOPPED";
|
||||
case CUDA_ERROR_NO_DEVICE:
|
||||
return "CUDA_ERROR_NO_DEVICE";
|
||||
case CUDA_ERROR_INVALID_DEVICE:
|
||||
return "CUDA_ERROR_INVALID_DEVICE";
|
||||
case CUDA_ERROR_INVALID_IMAGE:
|
||||
return "CUDA_ERROR_INVALID_IMAGE";
|
||||
case CUDA_ERROR_INVALID_CONTEXT:
|
||||
return "CUDA_ERROR_INVALID_CONTEXT";
|
||||
case CUDA_ERROR_CONTEXT_ALREADY_CURRENT:
|
||||
return "CUDA_ERROR_CONTEXT_ALREADY_CURRENT";
|
||||
case CUDA_ERROR_MAP_FAILED:
|
||||
return "CUDA_ERROR_MAP_FAILED";
|
||||
case CUDA_ERROR_UNMAP_FAILED:
|
||||
return "CUDA_ERROR_UNMAP_FAILED";
|
||||
case CUDA_ERROR_ARRAY_IS_MAPPED:
|
||||
return "CUDA_ERROR_ARRAY_IS_MAPPED";
|
||||
case CUDA_ERROR_ALREADY_MAPPED:
|
||||
return "CUDA_ERROR_ALREADY_MAPPED";
|
||||
case CUDA_ERROR_NO_BINARY_FOR_GPU:
|
||||
return "CUDA_ERROR_NO_BINARY_FOR_GPU";
|
||||
case CUDA_ERROR_ALREADY_ACQUIRED:
|
||||
return "CUDA_ERROR_ALREADY_ACQUIRED";
|
||||
case CUDA_ERROR_NOT_MAPPED:
|
||||
return "CUDA_ERROR_NOT_MAPPED";
|
||||
case CUDA_ERROR_NOT_MAPPED_AS_ARRAY:
|
||||
return "CUDA_ERROR_NOT_MAPPED_AS_ARRAY";
|
||||
case CUDA_ERROR_NOT_MAPPED_AS_POINTER:
|
||||
return "CUDA_ERROR_NOT_MAPPED_AS_POINTER";
|
||||
case CUDA_ERROR_ECC_UNCORRECTABLE:
|
||||
return "CUDA_ERROR_ECC_UNCORRECTABLE";
|
||||
case CUDA_ERROR_UNSUPPORTED_LIMIT:
|
||||
return "CUDA_ERROR_UNSUPPORTED_LIMIT";
|
||||
case CUDA_ERROR_CONTEXT_ALREADY_IN_USE:
|
||||
return "CUDA_ERROR_CONTEXT_ALREADY_IN_USE";
|
||||
case CUDA_ERROR_PEER_ACCESS_UNSUPPORTED:
|
||||
return "CUDA_ERROR_PEER_ACCESS_UNSUPPORTED";
|
||||
case CUDA_ERROR_INVALID_SOURCE:
|
||||
return "CUDA_ERROR_INVALID_SOURCE";
|
||||
case CUDA_ERROR_FILE_NOT_FOUND:
|
||||
return "CUDA_ERROR_FILE_NOT_FOUND";
|
||||
case CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND:
|
||||
return "CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND";
|
||||
case CUDA_ERROR_SHARED_OBJECT_INIT_FAILED:
|
||||
return "CUDA_ERROR_SHARED_OBJECT_INIT_FAILED";
|
||||
case CUDA_ERROR_OPERATING_SYSTEM:
|
||||
return "CUDA_ERROR_OPERATING_SYSTEM";
|
||||
case CUDA_ERROR_INVALID_HANDLE:
|
||||
return "CUDA_ERROR_INVALID_HANDLE";
|
||||
case CUDA_ERROR_NOT_FOUND:
|
||||
return "CUDA_ERROR_NOT_FOUND";
|
||||
case CUDA_ERROR_NOT_READY:
|
||||
return "CUDA_ERROR_NOT_READY";
|
||||
case CUDA_ERROR_LAUNCH_FAILED:
|
||||
return "CUDA_ERROR_LAUNCH_FAILED";
|
||||
case CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES:
|
||||
return "CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES";
|
||||
case CUDA_ERROR_LAUNCH_TIMEOUT:
|
||||
return "CUDA_ERROR_LAUNCH_TIMEOUT";
|
||||
case CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING:
|
||||
return "CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING";
|
||||
case CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED:
|
||||
return "CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED";
|
||||
case CUDA_ERROR_PEER_ACCESS_NOT_ENABLED:
|
||||
return "CUDA_ERROR_PEER_ACCESS_NOT_ENABLED";
|
||||
case CUDA_ERROR_PEER_MEMORY_ALREADY_REGISTERED:
|
||||
return "CUDA_ERROR_PEER_MEMORY_ALREADY_REGISTERED";
|
||||
case CUDA_ERROR_PEER_MEMORY_NOT_REGISTERED:
|
||||
return "CUDA_ERROR_PEER_MEMORY_NOT_REGISTERED";
|
||||
case CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE:
|
||||
return "CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE";
|
||||
case CUDA_ERROR_CONTEXT_IS_DESTROYED:
|
||||
return "CUDA_ERROR_CONTEXT_IS_DESTROYED";
|
||||
case CUDA_ERROR_ASSERT:
|
||||
return "CUDA_ERROR_ASSERT";
|
||||
case CUDA_ERROR_TOO_MANY_PEERS:
|
||||
return "CUDA_ERROR_TOO_MANY_PEERS";
|
||||
case CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED:
|
||||
return "CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED";
|
||||
case CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED:
|
||||
return "CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED";
|
||||
case CUDA_ERROR_NOT_PERMITTED:
|
||||
return "CUDA_ERROR_NOT_PERMITTED";
|
||||
case CUDA_ERROR_NOT_SUPPORTED:
|
||||
return "CUDA_ERROR_NOT_SUPPORTED";
|
||||
case CUDA_ERROR_UNKNOWN:
|
||||
return "CUDA_ERROR_UNKNOWN";
|
||||
}
|
||||
return "INVALID CUresult: " + result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private constructor to prevent instantiation.
|
||||
*/
|
||||
private CUresult() {
|
||||
}
|
||||
|
||||
}
|
||||
135
src/com/sheepit/client/hardware/gpu/GPU.java
Normal file
135
src/com/sheepit/client/hardware/gpu/GPU.java
Normal file
@@ -0,0 +1,135 @@
|
||||
/*
|
||||
* Copyright (C) 2013-2014 Laurent CLOUET
|
||||
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; version 2
|
||||
* of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package com.sheepit.client.hardware.gpu;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import com.sheepit.client.os.OS;
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.NativeLong;
|
||||
|
||||
public class GPU {
|
||||
public static List<GPUDevice> devices = null;
|
||||
|
||||
public static boolean generate() {
|
||||
OS os = OS.getOS();
|
||||
String path = os.getCUDALib();
|
||||
if (path == null) {
|
||||
System.out.println("GPU.listDevices failed to get CUDA lib");
|
||||
return false;
|
||||
}
|
||||
CUDA cudalib = null;
|
||||
try {
|
||||
cudalib = (CUDA) Native.loadLibrary(path, CUDA.class);
|
||||
}
|
||||
catch (java.lang.UnsatisfiedLinkError e) {
|
||||
System.out.println("GPU.listDevices failed to load CUDA lib");
|
||||
return false;
|
||||
}
|
||||
catch (java.lang.ExceptionInInitializerError e) {
|
||||
System.out.println("GPU.listDevices ExceptionInInitializerError " + e);
|
||||
return false;
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println("GPU.listDevices generic exception " + e);
|
||||
return false;
|
||||
}
|
||||
|
||||
int result = CUresult.CUDA_ERROR_UNKNOWN;
|
||||
|
||||
result = cudalib.cuInit(0);
|
||||
if (result != CUresult.CUDA_SUCCESS) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (result == CUresult.CUDA_ERROR_NO_DEVICE) {
|
||||
System.out.println("NO DEVICE");
|
||||
return false;
|
||||
}
|
||||
|
||||
int[] count = new int[1];
|
||||
result = cudalib.cuDeviceGetCount(count);
|
||||
|
||||
if (result != CUresult.CUDA_SUCCESS) {
|
||||
System.out.println("GPU.listDevices cuDeviceGetCount failed (ret: " + CUresult.stringFor(result) + ")");
|
||||
return false;
|
||||
}
|
||||
|
||||
devices = new LinkedList<GPUDevice>();
|
||||
|
||||
for (int num = 0; num < count[0]; num++) {
|
||||
byte name[] = new byte[256];
|
||||
|
||||
result = cudalib.cuDeviceGetName(name, 256, num);
|
||||
if (result != CUresult.CUDA_SUCCESS) {
|
||||
System.out.println("GPU.listDevices cuDeviceGetName failed (ret: " + CUresult.stringFor(result) + ")");
|
||||
continue;
|
||||
}
|
||||
|
||||
NativeLong[] ram = new NativeLong[1];
|
||||
result = cudalib.cuDeviceTotalMem(ram, num);
|
||||
|
||||
if (result != CUresult.CUDA_SUCCESS) {
|
||||
System.out.println("GPU.listDevices cuDeviceTotalMem failed (ret: " + CUresult.stringFor(result) + ")");
|
||||
return false;
|
||||
}
|
||||
|
||||
devices.add(new GPUDevice(new String(name).trim(), ram[0].longValue(), "CUDA_" + Integer.toString(num)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static List<String> listDevices() {
|
||||
if (devices == null) {
|
||||
generate();
|
||||
}
|
||||
if (devices == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<String> devs = new LinkedList<String>();
|
||||
for (GPUDevice dev : devices) {
|
||||
devs.add(dev.getModel());
|
||||
}
|
||||
return devs;
|
||||
}
|
||||
|
||||
public static GPUDevice getGPUDevice(String device_model) {
|
||||
if (device_model == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (devices == null) {
|
||||
generate();
|
||||
}
|
||||
|
||||
if (devices == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (GPUDevice dev : devices) {
|
||||
if (device_model.equals(dev.getCudaName()) || device_model.equals(dev.getModel())) {
|
||||
return dev;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
63
src/com/sheepit/client/hardware/gpu/GPUDevice.java
Normal file
63
src/com/sheepit/client/hardware/gpu/GPUDevice.java
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2013-2014 Laurent CLOUET
|
||||
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; version 2
|
||||
* of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
package com.sheepit.client.hardware.gpu;
|
||||
|
||||
public class GPUDevice {
|
||||
private String model;
|
||||
private long memory; // in B
|
||||
|
||||
private String cudaName;
|
||||
|
||||
public GPUDevice(String model, long ram, String cuda) {
|
||||
this.model = model;
|
||||
this.memory = ram;
|
||||
this.cudaName = cuda;
|
||||
}
|
||||
|
||||
public String getModel() {
|
||||
return model;
|
||||
}
|
||||
|
||||
public void setModel(String model) {
|
||||
this.model = model;
|
||||
}
|
||||
|
||||
public long getMemory() {
|
||||
return memory;
|
||||
}
|
||||
|
||||
public void setMemory(long memory) {
|
||||
this.memory = memory;
|
||||
}
|
||||
|
||||
public String getCudaName() {
|
||||
return cudaName;
|
||||
}
|
||||
|
||||
public void setCudaName(String cudaName) {
|
||||
this.cudaName = cudaName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "GPUDevice [model=" + model + ", memory=" + memory + ", cudaName=" + cudaName + "]";
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user