Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* JCuda - Java bindings for NVIDIA CUDA driver and runtime API
*
* Copyright (c) 2009-2015 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 org.nd4j.linalg.api.buffer.util;
import org.nd4j.linalg.io.ClassPathResource;
import java.io.*;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Locale;
/**
* Utility class for detecting the operating system and architecture
* types, and automatically loading the matching native library
* as a resource or from a file.
*
* The architecture and OS detection has been adapted from
* http://javablog.co.uk/2007/05/19/making-jni-cross-platform/
* and extended with http://lopica.sourceforge.net/os.html
*/
public final class LibUtils
{
/**
* Enumeration of common operating systems, independent of version
* or architecture.
*/
public enum OSType
{
APPLE, LINUX, SUN, WINDOWS, UNKNOWN
}
/**
* Enumeration of common CPU architectures.
*/
public enum ARCHType
{
PPC, PPC_64, SPARC, X86, X86_64, ARM, MIPS, RISC, UNKNOWN
}
/**
* Prepend jni to the name for certain classes
* @param clazz
*/
public static void loadJavaCpp(Class> clazz) {
loadLibrary("jni" + clazz.getSimpleName());
}
/**
* Loads the specified library. The full name of the library
* is created by calling {@link LibUtils#createLibName(String)}
* with the given argument. The method will attempt to load
* the library as a as a resource (for usage within a JAR),
* and, if this fails, using the usual System.loadLibrary
* call.
*
* @param baseName The base name of the library
* @throws UnsatisfiedLinkError if the native library
* could not be loaded.
*/
public static void loadLibrary(String baseName) {
String libName = LibUtils.createLibName(baseName);
Throwable throwable = null;
try {
loadLibraryResource(libName);
return;
} catch (Throwable t) {
throwable = t;
}
try {
System.loadLibrary(libName);
return;
} catch (Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("Error while loading native library \"" +
libName + "\" with base name \""+baseName+"\"");
pw.println("Operating system name: "+
System.getProperty("os.name"));
pw.println("Architecture : "+
System.getProperty("os.arch"));
pw.println("Architecture bit size: "+
System.getProperty("sun.arch.data.model"));
if (throwable != null)
{
pw.println(
"Stack trace from the attempt to " +
"load the library as a resource:");
throwable.printStackTrace(pw);
}
pw.println(
"Stack trace from the attempt to " +
"load the library as a file:");
t.printStackTrace(pw);
pw.flush();
pw.close();
throw new UnsatisfiedLinkError(
"Could not load the native library.\n"+
sw.toString());
}
}
/**
* Load the library with the given name from a resource.
* The extension for the current OS will be appended.
*
* @param libName The library name
* @throws Throwable If the library could not be loaded
*/
public static void loadTempBinaryFile(String libName) throws Exception
{
String libPrefix = createLibPrefix();
String libExtension = createLibExtension();
String fullName = libPrefix + libName;
String resourceName = fullName + "." + libExtension;
ClassPathResource resource = new ClassPathResource(resourceName);
InputStream inputStream = resource.getInputStream();
if (inputStream == null)
{
throw new NullPointerException(
"No resource found with name '" + resourceName + "'");
}
File tempFile = new File(System.getProperty("java.io.tmpdir"),fullName+ "." + libExtension);
tempFile.deleteOnExit();
OutputStream outputStream = null;
try
{
outputStream = new FileOutputStream(tempFile);
byte[] buffer = new byte[8192];
while (true)
{
int read = inputStream.read(buffer);
if (read < 0)
{
break;
}
outputStream.write(buffer, 0, read);
}
outputStream.flush();
outputStream.close();
outputStream = null;
System.load(tempFile.getAbsolutePath());
}
finally
{
if (outputStream != null)
{
outputStream.close();
}
}
}
/**
* Load the library with the given name from a resource.
* The extension for the current OS will be appended.
*
* @param libName The library name
* @throws Throwable If the library could not be loaded
*/
public static void loadTempBinaryFile(Class> libName) throws Exception {
String os = getOsName();
String arch = getArchName();
String resourceFolder = os + "-" + arch;
String libPrefix = createLibPrefix();
String libExtension = createLibExtension();
StringBuilder sb = new StringBuilder()
.append(libName.getPackage().getName().replace(".","/") + "/")
.append(resourceFolder).append("/").append(libPrefix).append("jni" + libName.getSimpleName() + ".")
.append(libExtension);
String resourceName = sb.toString();
ClassPathResource resource = new ClassPathResource(resourceName);
InputStream inputStream = resource.getInputStream();
if (inputStream == null)
{
throw new NullPointerException(
"No resource found with name '" + resourceName + "'");
}
String fullName = libPrefix + "jni" + libName.getSimpleName() + "." + libExtension;
File tempFile = new File(System.getProperty("java.io.tmpdir"), fullName );
tempFile.deleteOnExit();
OutputStream outputStream = null;
try
{
outputStream = new FileOutputStream(tempFile);
byte[] buffer = new byte[8192];
while (true)
{
int read = inputStream.read(buffer);
if (read < 0)
{
break;
}
outputStream.write(buffer, 0, read);
}
outputStream.flush();
outputStream.close();
outputStream = null;
System.load(tempFile.getAbsolutePath());
}
finally
{
if (outputStream != null)
{
outputStream.close();
}
}
}
/**
* Load the library with the given name from a resource.
* The extension for the current OS will be appended.
*
* @param libName The library name
* @throws Throwable If the library could not be loaded
*/
public static void loadJavaCppResource(String libName) throws Throwable
{
String libPrefix = createLibPrefix();
String libExtension = createLibExtension();
String fullName = libPrefix + libName;
String resourceName = fullName + "." + libExtension;
ClassPathResource resource = new ClassPathResource(resourceName);
InputStream inputStream = resource.getInputStream();
if (inputStream == null)
{
throw new NullPointerException(
"No resource found with name '" + resourceName + "'");
}
File tempFile = File.createTempFile(fullName, "."+libExtension);
tempFile.deleteOnExit();
OutputStream outputStream = null;
try
{
outputStream = new FileOutputStream(tempFile);
byte[] buffer = new byte[8192];
while (true)
{
int read = inputStream.read(buffer);
if (read < 0)
{
break;
}
outputStream.write(buffer, 0, read);
}
outputStream.flush();
outputStream.close();
outputStream = null;
System.load(tempFile.toString());
}
finally
{
if (outputStream != null)
{
outputStream.close();
}
}
}
/**
* Adds the specified path to the java library path
*
* @param pathToAdd the path to add
* @throws Exception
*/
public static void addLibraryPath(String pathToAdd) throws Exception {
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
//get array of paths
final String[] paths = (String[])usrPathsField.get(null);
//check if the path to add is already present
for(String path : paths) {
if(path.equals(pathToAdd)) {
return;
}
}
//add the new path
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length-1] = pathToAdd;
usrPathsField.set(null, newPaths);
}
/**
* Load the library with the given name from a resource.
* The extension for the current OS will be appended.
*
* @param libName The library name
* @throws Throwable If the library could not be loaded
*/
private static void loadLibraryResource(String libName) throws Throwable
{
String libPrefix = createLibPrefix();
String libExtension = createLibExtension();
String fullName = libPrefix + libName;
String resourceName = "/lib/" + fullName + "." + libExtension;
InputStream inputStream =
LibUtils.class.getResourceAsStream(resourceName);
if (inputStream == null)
{
throw new NullPointerException(
"No resource found with name '" + resourceName + "'");
}
File tempFile = File.createTempFile(fullName, "."+libExtension);
tempFile.deleteOnExit();
OutputStream outputStream = null;
try
{
outputStream = new FileOutputStream(tempFile);
byte[] buffer = new byte[8192];
while (true)
{
int read = inputStream.read(buffer);
if (read < 0)
{
break;
}
outputStream.write(buffer, 0, read);
}
outputStream.flush();
outputStream.close();
outputStream = null;
System.load(tempFile.toString());
}
finally
{
if (outputStream != null)
{
outputStream.close();
}
}
}
/**
* Get the name of the os
* for libary discovery on the classpath
* @return
*/
public static String getOsName() {
OSType osType = calculateOS();
switch (osType)
{
case APPLE:
return "macosx";
case LINUX:
return "linux";
case SUN:
return "sun";
case WINDOWS:
return "windows";
}
return "";
}
public static String getArchName() {
ARCHType archType = calculateArch();
switch (archType) {
case X86: return "x86";
case X86_64: return "x86_64";
case ARM: return "arm";
case PPC: return "ppc";
case PPC_64: return "ppc64";
case RISC: return "risc";
default: return "unknown";
}
}
/**
* Returns the extension for dynamically linked libraries on the
* current OS. That is, returns "dylib" on Apple, "so" on Linux
* and Sun, and "dll" on Windows.
*
* @return The library extension
*/
private static String createLibExtension()
{
OSType osType = calculateOS();
switch (osType)
{
case APPLE:
return "dylib";
case LINUX:
return "so";
case SUN:
return "so";
case WINDOWS:
return "dll";
}
return "";
}
/**
* Returns the prefix for dynamically linked libraries on the
* current OS. That is, returns "lib" on Apple, Linux and Sun,
* and the empty String on Windows.
*
* @return The library prefix
*/
private static String createLibPrefix()
{
OSType osType = calculateOS();
switch (osType)
{
case APPLE:
case LINUX:
case SUN:
return "lib";
case WINDOWS:
return "";
}
return "";
}
/**
* Creates the name for the native library with the given base
* name for the current operating system and architecture.
* The resulting name will be of the form
* baseName-OSType-ARCHType
* where OSType and ARCHType are the lower case Strings
* of the respective enum constants. Example:
* jcuda-windows-x86
*
* @param baseName The base name of the library
* @return The library name
*/
public static String createLibName(String baseName)
{
OSType osType = calculateOS();
ARCHType archType = calculateArch();
String libName = baseName;
libName += "-" + osType.toString().toLowerCase(Locale.ENGLISH);
libName += "-" + archType.toString().toLowerCase(Locale.ENGLISH);
return libName;
}
/**
* Calculates the current OSType
*
* @return The current OSType
*/
public static OSType calculateOS()
{
String osName = System.getProperty("os.name");
osName = osName.toLowerCase(Locale.ENGLISH);
if (osName.startsWith("mac os"))
{
return OSType.APPLE;
}
if (osName.startsWith("windows"))
{
return OSType.WINDOWS;
}
if (osName.startsWith("linux"))
{
return OSType.LINUX;
}
if (osName.startsWith("sun"))
{
return OSType.SUN;
}
return OSType.UNKNOWN;
}
/**
* Calculates the current ARCHType
*
* @return The current ARCHType
*/
public static ARCHType calculateArch()
{
String osArch = System.getProperty("os.arch");
osArch = osArch.toLowerCase(Locale.ENGLISH);
if (osArch.equals("i386") ||
osArch.equals("x86") ||
osArch.equals("i686"))
{
return ARCHType.X86;
}
if (osArch.startsWith("amd64") || osArch.startsWith("x86_64"))
{
return ARCHType.X86_64;
}
if (osArch.equals("ppc") || osArch.equals("powerpc"))
{
return ARCHType.PPC;
}
if (osArch.startsWith("ppc"))
{
return ARCHType.PPC_64;
}
if (osArch.startsWith("sparc"))
{
return ARCHType.SPARC;
}
if (osArch.startsWith("arm"))
{
return ARCHType.ARM;
}
if (osArch.startsWith("mips"))
{
return ARCHType.MIPS;
}
if (osArch.contains("risc"))
{
return ARCHType.RISC;
}
return ARCHType.UNKNOWN;
}
/**
* Private constructor to prevent instantiation.
*/
private LibUtils()
{
}
}