Commit 41db46f1 authored by Andrey Filippov's avatar Andrey Filippov

CLAUDE: Step 3 — backend selector (GpuQuad.create factory + -Dtp.backend=jna), 32 sites routed

GpuQuad.create(gpuTileProcessor, quadCLT, debug) returns the JCuda GpuQuad by default, or the native
GpuQuadJna when -Dtp.backend=jna (srcdir/devrt overridable via -Dtp.jna.srcdir / -Dtp.jna.devrt).
Routed all 32 main+aux `new GpuQuad(...)` 3-arg sites in Eyesis_Correction.java through the factory.
JCUDA remains the default (behavior identical when the property is unset). mvn -DskipTests compile clean.

Migration now fully implemented + compiling end-to-end (Step 1 native TpProc API, Step 2 GpuQuadJna
full CUAS surface, Step 3 selector). Ready for the JCUDA-vs-JNA comparison + incremental troubleshooting.
Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
parent 131b371e
......@@ -4795,7 +4795,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
}
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -4942,7 +4942,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
}
/*
* if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null))
* { // if GPU main is needed try { GPU_QUAD = new GpuQuad( GPU_TILE_PROCESSOR,
* { // if GPU main is needed try { GPU_QUAD = GpuQuad.create( GPU_TILE_PROCESSOR,
* QUAD_CLT); } catch (Exception e) {
* System.out.println("Failed to initialize GpuQuad class"); // TODO
* Auto-generated catch block e.printStackTrace(); return; // false; } //final
......@@ -4951,7 +4951,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -6215,7 +6215,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -6304,7 +6304,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -6450,7 +6450,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
}
/*
* if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null))
* { // if GPU main is needed try { GPU_QUAD = new GpuQuad( GPU_TILE_PROCESSOR,
* { // if GPU main is needed try { GPU_QUAD = GpuQuad.create( GPU_TILE_PROCESSOR,
* QUAD_CLT); } catch (Exception e) {
* System.out.println("Failed to initialize GpuQuad class"); // TODO
* Auto-generated catch block e.printStackTrace(); return; // false; } //final
......@@ -6458,7 +6458,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
*/
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -7055,7 +7055,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (GPU_QUAD == null) {
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -7510,7 +7510,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
}
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -7522,7 +7522,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -7598,7 +7598,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -7611,7 +7611,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -7695,7 +7695,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -7708,7 +7708,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -7788,7 +7788,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -7801,7 +7801,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -7882,7 +7882,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -7895,7 +7895,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -7968,7 +7968,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -7981,7 +7981,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -8055,7 +8055,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -8068,7 +8068,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -8143,7 +8143,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -8156,7 +8156,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -8228,7 +8228,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -8241,7 +8241,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -8314,7 +8314,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -8327,7 +8327,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -8417,7 +8417,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -8430,7 +8430,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......@@ -8510,7 +8510,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
if (CLT_PARAMETERS.useGPU(true) && (QUAD_CLT_AUX != null) && (GPU_QUAD_AUX == null)) { // if GPU AUX is
// needed
try {
GPU_QUAD_AUX = new GpuQuad(//
GPU_QUAD_AUX = GpuQuad.create(//
GPU_TILE_PROCESSOR, QUAD_CLT_AUX, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
......@@ -8523,7 +8523,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
} else {
if (CLT_PARAMETERS.useGPU(false) && (QUAD_CLT != null) && (GPU_QUAD == null)) { // if GPU main is needed
try {
GPU_QUAD = new GpuQuad(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
GPU_QUAD = GpuQuad.create(GPU_TILE_PROCESSOR, QUAD_CLT, CLT_PARAMETERS.gpu_debug_level);
} catch (Exception e) {
System.out.println("Failed to initialize GpuQuad class");
// TODO Auto-generated catch block
......
......@@ -490,6 +490,25 @@ public class GpuQuad{ // quad camera description
texture_stride_rgba = (int)(device_stride[0] / Sizeof.FLOAT);
}
// Backend selector (architecture B). Default JCUDA; set -Dtp.backend=jna to use the native
// (libtileproc.so via JNA) backend GpuQuadJna instead. JNA mode never initializes JCuda.
// Validate by running the same workflow both ways and diffing saved outputs.
public static boolean useJnaBackend() {
return "jna".equalsIgnoreCase(System.getProperty("tp.backend", "jcuda"));
}
public static GpuQuad create(
GPUTileProcessor gpuTileProcessor,
final QuadCLT quadCLT,
int debug_level) {
if (useJnaBackend()) {
String src = System.getProperty("tp.jna.srcdir", "/home/elphel/git/tile_processor_gpu/src");
String devrt = System.getProperty("tp.jna.devrt", "/usr/local/cuda/targets/x86_64-linux/lib/libcudadevrt.a");
System.out.println("GpuQuad.create(): NATIVE (JNA) backend for "+quadCLT+" (src="+src+")");
return new com.elphel.imagej.gpu.jna.GpuQuadJna(quadCLT, src, devrt, debug_level);
}
return new GpuQuad(gpuTileProcessor, quadCLT, debug_level);
}
// No-allocation constructor for the native (JNA) backend subclass GpuQuadJna.
// Sets the final config fields from quadCLT but allocates NO JCuda GPU memory and creates NO
// JCuda context (gpuTileProcessor = null). The subclass owns its native (TpProc) GPU memory and
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment