Skip to content

Commit 28316f0

Browse files
author
Olivier Chafik
committed
JavaCL: started playing with a the idea of an OpenCL implementation that relies on a Java proxy that channels IOpenCLLibrary implementations...
1 parent 7b61501 commit 28316f0

File tree

9 files changed

+415
-0
lines changed

9 files changed

+415
-0
lines changed

Proxy/pom.xml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>com.nativelibs4java</groupId>
5+
<artifactId>opencl-impl-proxy</artifactId>
6+
<name>JavalCL OpenCL Implementation Proxy</name>
7+
<url>http://code.google.com/p/javacl/</url>
8+
<packaging>jar</packaging>
9+
10+
<description>
11+
Native implementation of the OpenCL API (of its Icd) that relies on a Java proxy.
12+
That proxy channels implementations of com.nativelibs4java.opencl.library.IOpenCLLibrary discovered through the standard Java SPI discovery mechanism.
13+
This project also contains helpers to create such implementations.
14+
</description>
15+
16+
<parent>
17+
<groupId>com.nativelibs4java</groupId>
18+
<artifactId>javacl-parent</artifactId>
19+
<version>1.0-SNAPSHOT</version>
20+
<relativePath>..</relativePath>
21+
</parent>
22+
23+
<dependencies>
24+
<dependency>
25+
<groupId>com.nativelibs4java</groupId>
26+
<artifactId>opencl4java</artifactId>
27+
</dependency>
28+
</dependencies>
29+
30+
<build>
31+
<plugins>
32+
<plugin>
33+
<groupId>org.apache.maven.plugins</groupId>
34+
<artifactId>maven-jar-plugin</artifactId>
35+
</plugin>
36+
37+
<plugin>
38+
<groupId>org.apache.maven.plugins</groupId>
39+
<artifactId>maven-shade-plugin</artifactId>
40+
<executions>
41+
<execution>
42+
<id>full-package</id>
43+
<phase>package</phase>
44+
<goals>
45+
<goal>shade</goal>
46+
</goals>
47+
<configuration>
48+
<shadedArtifactAttached>${shadedArtifactAttached}</shadedArtifactAttached>
49+
</configuration>
50+
</execution>
51+
</executions>
52+
</plugin>
53+
</plugins>
54+
</build>
55+
</project>
56+
57+
58+

Proxy/src/main/cpp/proxy/API.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "API.h"
2+
3+
jclass gOpenCLProxyInterface = NULL;
4+
jmethodID gclGetPlatformIDsMethod = NULL;
5+
jobject gOpenCLProxyImplementation = NULL;
6+
7+
void bindJavaAPI(void *instanceData) {
8+
jclass proxyClass = NULL;
9+
jmethodID getProxyInstanceMethod = NULL;
10+
JNIEnv *env = GetEnv();
11+
gOpenCLProxyInterface = GLOBAL_REF((*env)->FindClass(env, PROXY_INTERFACE_SIG));
12+
gclGetPlatformIDsMethod = (*env)->GetMethodID(env, proxyClass, "clGetPlatformIDs", "(ILL)I");
13+
14+
proxyClass = (*env)->FindClass(env, "com/nativelibs4java/opencl/library/Proxy");
15+
getProxyInstanceMethod = (*env)->GetStaticMethodID(env, proxyClass, "getInstance", "(L)L" PROXY_INTERFACE_SIG ";");
16+
gOpenCLProxyImplementation = GLOBAL_REF((*env)->CallStaticObjectMethod(env, proxyClass, getProxyInstanceMethod, (jlong)(size_t)instanceData));
17+
}
18+
19+
void unbindJavaAPI() {
20+
JNIEnv *env = GetEnv();
21+
DEL_GLOBAL_REF(gOpenCLProxyImplementation);
22+
DEL_GLOBAL_REF(gOpenCLProxyInterface);
23+
}
24+

Proxy/src/main/cpp/proxy/API.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef __JAVACL_PROXY_API_H
2+
#define __JAVACL_PROXY_API_H
3+
4+
#ifdef __APPLE__
5+
#include <OpenCL/cl.h>
6+
#else
7+
#include <CL/cl.h>
8+
#endif
9+
10+
#include "Common.h"
11+
12+
extern jclass gOpenCLProxyInterface;
13+
extern jmethodID gclGetPlatformIDsMethod;
14+
extern jobject gOpenCLProxyImplementation;
15+
16+
void bindJavaAPI(void *instanceData);
17+
void unbindJavaAPI();
18+
19+
#endif // __JAVACL_PROXY_API_H

Proxy/src/main/cpp/proxy/Common.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef __JAVACL_PROXY_COMMON_H
2+
#define __JAVACL_PROXY_COMMON_H
3+
4+
// /System/Library/Frameworks/OpenCL.framework/Headers/cl.h
5+
// http://manpages.ubuntu.com/manpages/raring/man7/libOpenCL.7.html
6+
// http://www.khronos.org/registry/cl/extensions/khr/cl_khr_icd.txt
7+
// git clone https://forge.imag.fr/anonscm/git/ocl-icd/ocl-icd.git
8+
9+
#include <jni.h>
10+
11+
#ifdef __GNUC__
12+
#define JAVACL_PROXY_API
13+
#define __cdecl
14+
#define __stdcall
15+
#else
16+
#ifdef JAVACL_PROXY_EXPORTS
17+
#define JAVACL_PROXY_API __declspec(dllexport)
18+
#else
19+
#define JAVACL_PROXY_API __declspec(dllimport)
20+
#endif
21+
#endif
22+
23+
JNIEnv* GetEnv();
24+
25+
#define GLOBAL_REF(v) (*env)->NewGlobalRef(env, v)
26+
#define DEL_GLOBAL_REF(v) (*env)->DeleteGlobalRef(env, v)
27+
28+
#define PROXY_INTERFACE_SIG "com/nativelibs4java/opencl/library/IOpenCLLibrary"
29+
30+
struct _cl_icd_dispatch;
31+
32+
#endif // __JAVACL_PROXY_COMMON_H
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#//////////////////////////////////////////////////////////////////////////////
2+
#
3+
# Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>,
4+
# Tassilo Philipp <tphilipp@potion-studios.com>
5+
#
6+
# Permission to use, copy, modify, and distribute this software for any
7+
# purpose with or without fee is hereby granted, provided that the above
8+
# copyright notice and this permission notice appear in all copies.
9+
#
10+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11+
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12+
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13+
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14+
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15+
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16+
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17+
#
18+
#//////////////////////////////////////////////////////////////////////////////
19+
20+
#BUILD_CONFIG=debug
21+
22+
DLL_PREFIX=lib
23+
LD=gcc
24+
CXX=gcc
25+
26+
COMPILE_PIC = 1
27+
28+
TOP = $(DYNCALL_HOME)/dyncall
29+
include $(DYNCALL_HOME)/dyncall/buildsys/gmake/prolog.gmake
30+
31+
TARGET_DLL = javacl
32+
INSTALL_LIB = 1
33+
34+
# uses some dyncall headers - no other dependencies.
35+
36+
UNITS += API
37+
UNITS += Proxy
38+
UNITS += Library
39+
40+
CPPFLAGS += -Werror
41+
CPPFLAGS += -std=c99
42+
#CFLAGS += -g
43+
44+
# Lower requirement for GLIBC version number (2.2.5) :
45+
# objdump -p src/main/resources/org/bridj/lib/linux_x64/bridj.so | fgrep 'Version References:' -A 100
46+
CPPFLAGS += -U_FORTIFY_SOURCE
47+
48+
ifdef BUILD_OS_darwin
49+
CPPFLAGS += -I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/
50+
LDFLAGS += -ldl -framework Foundation -all_load
51+
endif
52+
53+
ifdef BUILD_OS_linux
54+
CPPFLAGS += -I/usr/lib/jvm/java-6-sun/include/
55+
CPPFLAGS += -I/usr/lib/jvm/java-6-sun/include/linux
56+
CPPFLAGS += -I/usr/lib/jvm/java-6-openjdk/include/
57+
CPPFLAGS += -I/usr/lib/jvm/java-6-openjdk/include/linux
58+
CPPFLAGS += -I/usr/lib/jvm/java-6-openjdk-armhf/include
59+
CPPFLAGS += -I/usr/lib/jvm/java-6-openjdk-armhf/include/linux
60+
CPPFLAGS += -I/usr/lib/jvm/java-6-openjdk-armel/include
61+
CPPFLAGS += -I/usr/lib/jvm/java-6-openjdk-armel/include/linux
62+
endif
63+
64+
ifdef BUILD_OS_sunos
65+
# http://gcc.gnu.org/onlinedocs/gcc/Solaris-2-Options.html
66+
CPPFLAGS += -I/usr/jdk/instances/jdk1.5.0/include
67+
CPPFLAGS += -I/usr/jdk/instances/jdk1.5.0/include/solaris
68+
LDFLAGS += -mimpure-text
69+
LDFLAGS += -L/opt/csw/gcc4/lib
70+
endif
71+
72+
ifdef BUILD_OS_darwin
73+
CPPFLAGS += -mmacosx-version-min=10.4
74+
LDFLAGS += -mmacosx-version-min=10.4
75+
endif
76+
77+
ifdef BUILD_CONFIG_debug
78+
CPPFLAGS += -O0 -g
79+
else
80+
CPPFLAGS += -O3
81+
endif
82+
83+
include $(DYNCALL_HOME)/dyncall/buildsys/gmake/epilog.gmake

Proxy/src/main/cpp/proxy/Library.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "Common.h"
2+
#include "API.h"
3+
#include "Proxy.h"
4+
5+
JavaVM* gJVM = NULL;
6+
#define JNI_VERSION JNI_VERSION_1_4
7+
8+
JNIEnv* GetEnv() {
9+
JNIEnv* env = NULL;
10+
if ((*gJVM)->GetEnv(gJVM, (void*)&env, JNI_VERSION) != JNI_OK) {
11+
if ((*gJVM)->AttachCurrentThreadAsDaemon(gJVM, (void*)&env, NULL) != JNI_OK) {
12+
printf("BridJ: Cannot attach current JVM thread !\n");
13+
return NULL;
14+
}
15+
}
16+
return env;
17+
}
18+
19+
struct _cl_icd_dispatch dispatch;
20+
21+
void initializeLibrary() {
22+
// Create JVM, based on env. OPENCL_PROXY_JAR
23+
// ...
24+
25+
// Bind classes and methods.
26+
bindJavaAPI(&gJavaCLProxyDispatch);
27+
}
28+
29+
void cleanupLibrary() {
30+
// Unbind classes and methods
31+
unbindJavaAPI();
32+
33+
// Stop JVM
34+
// ...
35+
}
36+

Proxy/src/main/cpp/proxy/Proxy.c

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#include "Common.h"
2+
#include "Proxy.h"
3+
#include "API.h"
4+
5+
// AUTOGENERATED {{{
6+
7+
cl_int JAVACL_PROXY_API
8+
JAVAclGetPlatformIDs(cl_uint num_entries,
9+
cl_platform_id * platforms,
10+
cl_uint * num_platforms) {
11+
JNIEnv *env = GetEnv();
12+
return (cl_int)(*env)->CallIntMethod(env, gOpenCLProxyImplementation, gclGetPlatformIDsMethod, (jint)num_entries, (jlong)(size_t)platforms, (jlong)(size_t)num_platforms);
13+
}
14+
15+
// }}} AUTOGENERATED
16+
17+
// See https://github.com/NatTuck/pocl/blob/master/lib/CL/pocl_icd.h
18+
struct _cl_icd_dispatch gJavaCLProxyDispatch = {
19+
&JAVAclGetPlatformIDs,
20+
NULL, // &JAVAclGetPlatformInfo,
21+
NULL, // &JAVAclGetDeviceIDs,
22+
NULL, // &JAVAclGetDeviceInfo,
23+
NULL, // &JAVAclCreateContext,
24+
NULL, // &JAVAclCreateContextFromType,
25+
NULL, // &JAVAclRetainContext,
26+
NULL, // &JAVAclReleaseContext,
27+
NULL, // &JAVAclGetContextInfo,
28+
NULL, // &JAVAclCreateCommandQueue,
29+
NULL, // &JAVAclRetainCommandQueue,
30+
NULL, // &JAVAclReleaseCommandQueue,
31+
NULL, // &JAVAclGetCommandQueueInfo,
32+
NULL, // &JAVAclSetCommandQueueProperty,
33+
NULL, // &JAVAclCreateBuffer,
34+
NULL, // &JAVAclCreateImage2D,
35+
NULL, // &JAVAclCreateImage3D,
36+
NULL, // &JAVAclRetainMemObject,
37+
NULL, // &JAVAclReleaseMemObject,
38+
NULL, // &JAVAclGetSupportedImageFormats,
39+
NULL, // &JAVAclGetMemObjectInfo,
40+
NULL, // &JAVAclGetImageInfo,
41+
NULL, // &JAVAclCreateSampler,
42+
NULL, // &JAVAclRetainSampler,
43+
NULL, // &JAVAclReleaseSampler,
44+
NULL, // &JAVAclGetSamplerInfo,
45+
NULL, // &JAVAclCreateProgramWithSource,
46+
NULL, // &JAVAclCreateProgramWithBinary,
47+
NULL, // &JAVAclRetainProgram,
48+
NULL, // &JAVAclReleaseProgram,
49+
NULL, // &JAVAclBuildProgram,
50+
NULL, // &JAVAclUnloadCompiler,
51+
NULL, // &JAVAclGetProgramInfo,
52+
NULL, // &JAVAclGetProgramBuildInfo,
53+
NULL, // &JAVAclCreateKernel,
54+
NULL, // &JAVAclCreateKernelsInProgram,
55+
NULL, // &JAVAclRetainKernel,
56+
NULL, // &JAVAclReleaseKernel,
57+
NULL, // &JAVAclSetKernelArg,
58+
NULL, // &JAVAclGetKernelInfo,
59+
NULL, // &JAVAclGetKernelWorkGroupInfo,
60+
NULL, // &JAVAclWaitForEvents,
61+
NULL, // &JAVAclGetEventInfo,
62+
NULL, // &JAVAclRetainEvent,
63+
NULL, // &JAVAclReleaseEvent,
64+
NULL, // &JAVAclGetEventProfilingInfo,
65+
NULL, // &JAVAclFlush,
66+
NULL, // &JAVAclFinish,
67+
NULL, // &JAVAclEnqueueReadBuffer,
68+
NULL, // &JAVAclEnqueueWriteBuffer,
69+
NULL, // &JAVAclEnqueueCopyBuffer,
70+
NULL, // &JAVAclEnqueueReadImage,
71+
NULL, // &JAVAclEnqueueWriteImage,
72+
NULL, // &JAVAclEnqueueCopyImage,
73+
NULL, // &JAVAclEnqueueCopyImageToBuffer,
74+
NULL, // &JAVAclEnqueueCopyBufferToImage,
75+
NULL, // &JAVAclEnqueueMapBuffer,
76+
NULL, // &JAVAclEnqueueMapImage,
77+
NULL, // &JAVAclEnqueueUnmapMemObject,
78+
NULL, // &JAVAclEnqueueNDRangeKernel,
79+
NULL, // &JAVAclEnqueueTask,
80+
NULL, // &JAVAclEnqueueNativeKernel,
81+
NULL, // &JAVAclEnqueueMarker,
82+
NULL, // &JAVAclEnqueueWaitForEvents,
83+
NULL, // &JAVAclEnqueueBarrier,
84+
NULL, // &JAVAclGetExtensionFunctionAddress,
85+
NULL, // &JAVAclCreateFromGLBuffer,
86+
NULL, // &JAVAclCreateFromGLTexture2D,
87+
NULL, // &JAVAclCreateFromGLTexture3D,
88+
NULL, // &JAVAclCreateFromGLRenderbuffer,
89+
NULL, // &JAVAclGetGLObjectInfo,
90+
NULL, // &JAVAclGetGLTextureInfo,
91+
NULL, // &JAVAclEnqueueAcquireGLObjects,
92+
NULL, // &JAVAclEnqueueReleaseGLObjects,
93+
NULL, // &JAVAclGetGLContextInfoKHR,
94+
NULL, // &clUnknown75,
95+
NULL, // &clUnknown76,
96+
NULL, // &clUnknown77,
97+
NULL, // &clUnknown78,
98+
NULL, // &clUnknown79,
99+
NULL, // &clUnknown80,
100+
NULL, // &JAVAclSetEventCallback,
101+
NULL, // &JAVAclCreateSubBuffer,
102+
NULL, // &JAVAclSetMemObjectDestructorCallback,
103+
NULL, // &JAVAclCreateUserEvent,
104+
NULL, // &JAVAclSetUserEventStatus,
105+
NULL, // &JAVAclEnqueueReadBufferRect,
106+
NULL, // &JAVAclEnqueueWriteBufferRect,
107+
NULL, // &JAVAclEnqueueCopyBufferRect,
108+
NULL, // &JAVAclCreateSubDevicesEXT,
109+
NULL, // &JAVAclRetainDeviceEXT,
110+
NULL, // &JAVAclReleaseDeviceEXT,
111+
NULL, // &clUnknown92,
112+
NULL, // &JAVAclCreateSubDevices,
113+
NULL, // &JAVAclRetainDevice,
114+
NULL, // &JAVAclReleaseDevice,
115+
NULL, // &JAVAclCreateImage,
116+
NULL, // &JAVAclCreateProgramWithBuiltInKernels,
117+
NULL, // &JAVAclCompileProgram,
118+
NULL, // &JAVAclLinkProgram,
119+
NULL, // &JAVAclUnloadPlatformCompiler,
120+
NULL, // &JAVAclGetKernelArgInfo,
121+
NULL, // &JAVAclEnqueueFillBuffer,
122+
NULL, // &JAVAclEnqueueFillImage,
123+
NULL, // &JAVAclEnqueueMigrateMemObjects,
124+
NULL, // &JAVAclEnqueueMarkerWithWaitList,
125+
NULL, // &JAVAclEnqueueBarrierWithWaitList,
126+
NULL, // &JAVAclGetExtensionFunctionAddressForPlatform,
127+
NULL, // &JAVAclCreateFromGLTexture,
128+
};
129+

Proxy/src/main/cpp/proxy/Proxy.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef __JAVACL_PROXY_PROXY_H
2+
#define __JAVACL_PROXY_PROXY_H
3+
4+
struct _cl_icd_dispatch {
5+
void *funcptr[109];
6+
};
7+
8+
struct _cl_icd_dispatch gJavaCLProxyDispatch;
9+
10+
#endif // __JAVACL_PROXY_PROXY_H

0 commit comments

Comments
 (0)