diff --git a/JCudaSamples/src/main/java/jcuda/driver/samples/JCudaDriverBasicStreamCallback.java b/JCudaSamples/src/main/java/jcuda/driver/samples/JCudaDriverBasicStreamCallback.java new file mode 100644 index 0000000..0203d0a --- /dev/null +++ b/JCudaSamples/src/main/java/jcuda/driver/samples/JCudaDriverBasicStreamCallback.java @@ -0,0 +1,100 @@ +/* + * JCuda - Java bindings for NVIDIA CUDA + * + * Copyright 2008-2017 Marco Hutter - http://www.jcuda.org + */ +package jcuda.driver.samples; + +import static jcuda.driver.JCudaDriver.cuCtxCreate; +import static jcuda.driver.JCudaDriver.cuCtxDestroy; +import static jcuda.driver.JCudaDriver.cuDeviceGet; +import static jcuda.driver.JCudaDriver.cuInit; +import static jcuda.driver.JCudaDriver.cuMemAlloc; +import static jcuda.driver.JCudaDriver.cuMemFree; +import static jcuda.driver.JCudaDriver.cuMemcpyHtoDAsync; +import static jcuda.driver.JCudaDriver.cuStreamAddCallback; +import static jcuda.driver.JCudaDriver.cuStreamCreate; +import static jcuda.driver.JCudaDriver.cuStreamSynchronize; + +import jcuda.Pointer; +import jcuda.Sizeof; +import jcuda.driver.CUcontext; +import jcuda.driver.CUdevice; +import jcuda.driver.CUdeviceptr; +import jcuda.driver.CUstream; +import jcuda.driver.CUstreamCallback; +import jcuda.driver.JCudaDriver; + +/** + * A very basic example / test for the stream callback functionality in the + * JCuda Driver API + */ +public class JCudaDriverBasicStreamCallback +{ + /** + * Entry point of this program + * + * @param args Not used + */ + public static void main(String[] args) + { + JCudaDriver.setExceptionsEnabled(true); + + // Default initialization + cuInit(0); + CUcontext context = new CUcontext(); + CUdevice device = new CUdevice(); + cuDeviceGet(device, 0); + cuCtxCreate(context, 0, device); + + // The stream on which the callbacks will be registered. + // When this is "null", then it is the default stream. + CUstream stream = null; + + boolean useDefaultStream = true; + useDefaultStream = false; + if (!useDefaultStream) + { + stream = new CUstream(); + cuStreamCreate(stream, 0); + } + System.out.println("Using stream " + stream); + + // Define the callback + CUstreamCallback callback = new CUstreamCallback() + { + @Override + public void call(CUstream hStream, int status, Object userData) + { + System.out.println("Callback called"); + System.out.println(" stream : " + hStream); + System.out.println(" status : " + status); + System.out.println(" userData: " + userData); + System.out.println(" thread : " + Thread.currentThread()); + } + }; + + // Create some dummy data on the host, and copy it to the + // device asynchronously + int n = 100000; + float hostData[] = new float[n]; + CUdeviceptr deviceData = new CUdeviceptr(); + cuMemAlloc(deviceData, n * Sizeof.FLOAT); + cuMemcpyHtoDAsync(deviceData, Pointer.to(hostData), + n * Sizeof.FLOAT, stream); + + // Add the callback to the stream that carries the copy operation + Object userData = "Example user data"; + cuStreamAddCallback(stream, callback, userData, 0); + + // Wait until the stream is finished + cuStreamSynchronize(stream); + + // Clean up + cuMemFree(deviceData); + cuCtxDestroy(context); + + System.out.println("Done"); + } + +} diff --git a/JCudaSamples/src/main/java/jcuda/driver/samples/JCudaDriverStreamCallbacks.java b/JCudaSamples/src/main/java/jcuda/driver/samples/JCudaDriverStreamCallbacks.java new file mode 100644 index 0000000..7afbc85 --- /dev/null +++ b/JCudaSamples/src/main/java/jcuda/driver/samples/JCudaDriverStreamCallbacks.java @@ -0,0 +1,346 @@ +/* + * JCuda - Java bindings for NVIDIA CUDA + * + * Copyright 2008-2017 Marco Hutter - http://www.jcuda.org + */ +package jcuda.driver.samples; + +import static jcuda.driver.JCudaDriver.cuCtxCreate; +import static jcuda.driver.JCudaDriver.cuCtxSetCurrent; +import static jcuda.driver.JCudaDriver.cuDeviceGet; +import static jcuda.driver.JCudaDriver.cuInit; +import static jcuda.driver.JCudaDriver.cuLaunchKernel; +import static jcuda.driver.JCudaDriver.cuMemAlloc; +import static jcuda.driver.JCudaDriver.cuMemHostAlloc; +import static jcuda.driver.JCudaDriver.cuMemcpyDtoHAsync; +import static jcuda.driver.JCudaDriver.cuMemcpyHtoDAsync; +import static jcuda.driver.JCudaDriver.cuModuleGetFunction; +import static jcuda.driver.JCudaDriver.cuModuleLoadData; +import static jcuda.driver.JCudaDriver.cuStreamAddCallback; +import static jcuda.driver.JCudaDriver.cuStreamCreate; +import static jcuda.nvrtc.JNvrtc.nvrtcCompileProgram; +import static jcuda.nvrtc.JNvrtc.nvrtcCreateProgram; +import static jcuda.nvrtc.JNvrtc.nvrtcDestroyProgram; +import static jcuda.nvrtc.JNvrtc.nvrtcGetPTX; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import jcuda.Pointer; +import jcuda.Sizeof; +import jcuda.driver.CUcontext; +import jcuda.driver.CUdevice; +import jcuda.driver.CUdeviceptr; +import jcuda.driver.CUfunction; +import jcuda.driver.CUmodule; +import jcuda.driver.CUstream; +import jcuda.driver.CUstreamCallback; +import jcuda.driver.JCudaDriver; +import jcuda.nvrtc.JNvrtc; +import jcuda.nvrtc.nvrtcProgram; + +/** + * An example showing stream callbacks involving multiple streams + * and threads + */ +public class JCudaDriverStreamCallbacks +{ + /** + * A kernel that increments all elements of an int array by 1 + */ + private static String programSourceCode = + "extern \"C\"" + "\n" + + "__global__ void example(int n, int *data)" + "\n" + + "{" + "\n" + + " int i = blockIdx.x * blockDim.x + threadIdx.x;" + "\n" + + " if (i()) + { + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + throw new RuntimeException(t); + } + } + }; + e.allowCoreThreadTimeOut(true); + return e; + } + +} diff --git a/JCudaSamples/src/main/java/jcuda/runtime/samples/JCudaRuntimeBasicStreamCallback.java b/JCudaSamples/src/main/java/jcuda/runtime/samples/JCudaRuntimeBasicStreamCallback.java new file mode 100644 index 0000000..165839f --- /dev/null +++ b/JCudaSamples/src/main/java/jcuda/runtime/samples/JCudaRuntimeBasicStreamCallback.java @@ -0,0 +1,86 @@ +/* + * JCuda - Java bindings for NVIDIA CUDA + * + * Copyright 2008-2017 Marco Hutter - http://www.jcuda.org + */ +package jcuda.runtime.samples; + +import static jcuda.runtime.JCuda.cudaFree; +import static jcuda.runtime.JCuda.cudaMalloc; +import static jcuda.runtime.JCuda.cudaMemcpyAsync; +import static jcuda.runtime.JCuda.cudaStreamAddCallback; +import static jcuda.runtime.JCuda.cudaStreamCreate; +import static jcuda.runtime.JCuda.cudaStreamSynchronize; +import static jcuda.runtime.cudaMemcpyKind.cudaMemcpyHostToDevice; + +import jcuda.Pointer; +import jcuda.Sizeof; +import jcuda.runtime.JCuda; +import jcuda.runtime.cudaStreamCallback; +import jcuda.runtime.cudaStream_t; + +/** + * A very basic example / test for the stream callback functionality in the + * JCuda Runtime API + */ +public class JCudaRuntimeBasicStreamCallback +{ + /** + * Entry point of this program + * + * @param args Not used + */ + public static void main(String[] args) + { + JCuda.setExceptionsEnabled(true); + + // The stream on which the callbacks will be registered. + // When this is "null", then it is the default stream. + cudaStream_t stream = null; + + boolean useDefaultStream = true; + useDefaultStream = false; + if (!useDefaultStream) + { + stream = new cudaStream_t(); + cudaStreamCreate(stream); + } + System.out.println("Using stream " + stream); + + // Define the callback + cudaStreamCallback callback = new cudaStreamCallback() + { + @Override + public void call(cudaStream_t stream, int status, Object userData) + { + System.out.println("Callback called"); + System.out.println(" stream : " + stream); + System.out.println(" status : " + status); + System.out.println(" userData: " + userData); + System.out.println(" thread : " + Thread.currentThread()); + } + }; + + // Create some dummy data on the host, and copy it to the + // device asynchronously + int n = 100000; + float hostData[] = new float[n]; + Pointer deviceData = new Pointer(); + cudaMalloc(deviceData, n * Sizeof.FLOAT); + cudaMemcpyAsync(deviceData, Pointer.to(hostData), + n * Sizeof.FLOAT, cudaMemcpyHostToDevice, stream); + + // Add the callback to the stream that carries the copy operation + Object userData = "Example user data"; + cudaStreamAddCallback(stream, callback, userData, 0); + + // Wait until the stream is finished + cudaStreamSynchronize(stream); + + // Clean up + cudaFree(deviceData); + + System.out.println("Done"); + } + +}