diff --git a/CHANGELOG.md b/CHANGELOG.md index 19fb6e00d47f1e0c37f2cb911649751fc00b0937..b87a8fe90bcbb4a7c778f883709fcf4d8ee64e35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Aparapi Change Log +## 1.2.0 + +* Kernels of the same class are now eligible to be run on different devices + ## 1.1.2 * Fixed a bug where OpenCL kernels were getting compiled twice. diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c73baf7975bd988a9186a28e19e30db865454e29..8f78b0eb5a2cfdda1f84930f85fc72eb08c06de0 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,6 +1,7 @@ # Contributors * Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com> +* Florian Roesler <florian.roesler@wooga.net> * George Vinokhodov * Witold Bolt * Kenneth Skovhede diff --git a/pom.xml b/pom.xml index 72d24fd3b9d1040372c012a3f59f57b71ad552b5..3a3353ede0ed607976ae07246e774982421795c8 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ <groupId>com.aparapi</groupId> <artifactId>aparapi</artifactId> - <version>1.1.3-SNAPSHOT</version> + <version>1.2.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> diff --git a/src/main/java/com/aparapi/device/Device.java b/src/main/java/com/aparapi/device/Device.java index 936724483f795b1f8f3578b75b633a8bd113da70..e43e90b25d65cf1a35d896a2a7f503dbe8bf3da5 100644 --- a/src/main/java/com/aparapi/device/Device.java +++ b/src/main/java/com/aparapi/device/Device.java @@ -177,6 +177,6 @@ public abstract class Device{ @Override public int hashCode() { - return Long.hashCode(getDeviceId()); + return Long.valueOf(getDeviceId()).hashCode(); } } diff --git a/src/main/java/com/aparapi/internal/kernel/KernelManager.java b/src/main/java/com/aparapi/internal/kernel/KernelManager.java index e8359b932d4633169dee6e52ebdffa6200202fb2..fb1d9aadf1b797fcae41564edd725d73612bbaac 100644 --- a/src/main/java/com/aparapi/internal/kernel/KernelManager.java +++ b/src/main/java/com/aparapi/internal/kernel/KernelManager.java @@ -28,7 +28,7 @@ import java.util.*; public class KernelManager { private static KernelManager INSTANCE = new KernelManager(); - private LinkedHashMap<Class<? extends Kernel>, KernelPreferences> preferences = new LinkedHashMap<>(); + private LinkedHashMap<Integer, PreferencesWrapper> preferences = new LinkedHashMap<>(); private LinkedHashMap<Class<? extends Kernel>, KernelProfile> profiles = new LinkedHashMap<>(); private LinkedHashMap<Class<? extends Kernel>, Kernel> sharedInstances = new LinkedHashMap<>(); @@ -88,8 +88,9 @@ public class KernelManager { builder.append(" (showing mean elapsed times in milliseconds)"); } builder.append("\n\n"); - for (Class<? extends Kernel> klass : preferences.keySet()) { - KernelPreferences preferences = this.preferences.get(klass); + for (PreferencesWrapper wrapper : preferences.values()) { + KernelPreferences preferences = wrapper.getPreferences(); + Class<? extends Kernel> klass = wrapper.getKernel().getClass(); KernelProfile profile = withProfilingInfo ? profiles.get(klass) : null; builder.append(klass.getName()).append(":\n\tusing ").append(preferences.getPreferredDevice(null).getShortDescription()); List<Device> failedDevices = preferences.getFailedDevices(); @@ -139,10 +140,13 @@ public class KernelManager { public KernelPreferences getPreferences(Kernel kernel) { synchronized (preferences) { - KernelPreferences kernelPreferences = preferences.get(kernel.getClass()); - if (kernelPreferences == null) { + PreferencesWrapper wrapper = preferences.get(kernel.hashCode()); + KernelPreferences kernelPreferences; + if (wrapper == null) { kernelPreferences = new KernelPreferences(this, kernel.getClass()); - preferences.put(kernel.getClass(), kernelPreferences); + preferences.put(kernel.hashCode(), new PreferencesWrapper(kernel, kernelPreferences)); + }else{ + kernelPreferences = preferences.get(kernel.hashCode()).getPreferences(); } return kernelPreferences; } diff --git a/src/main/java/com/aparapi/internal/kernel/PreferencesWrapper.java b/src/main/java/com/aparapi/internal/kernel/PreferencesWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f5ee10916e9de4b117240d539c9b20d461172fa7 --- /dev/null +++ b/src/main/java/com/aparapi/internal/kernel/PreferencesWrapper.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2016 - 2017 Syncleus, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.aparapi.internal.kernel; + +import com.aparapi.Kernel; + +public class PreferencesWrapper { + + private Kernel kernel; + private KernelPreferences preferences; + + public PreferencesWrapper(Kernel kernel, KernelPreferences preferences) { + super(); + this.kernel = kernel; + this.preferences = preferences; + } + + public Kernel getKernel() { + return kernel; + } + + public KernelPreferences getPreferences() { + return preferences; + } +} +