From e59e4f2ee0355cd27d77a1f8af5ea409dcb82b6f Mon Sep 17 00:00:00 2001 From: John Romein <romein@astron.nl> Date: Mon, 17 Dec 2012 14:33:29 +0000 Subject: [PATCH] Task #3696 * removed generated *.ptx files from svn * better support for 288 stations (#define USE_NEW_CORRELATOR) * workqueues now scheduled asynchronously (#pragma omp ... nowait) --- .gitattributes | 17 - .../src/BeamFormer/BeamFormer.cl-0.ptx | 607 -------------- .../src/BeamFormer/CoherentStokes.cl-0.ptx | Bin 29008 -> 0 bytes .../src/BeamFormer/Dedispersion.cl-0.ptx | 417 ---------- .../src/BeamFormer/IncoherentStokes.cl-0.ptx | Bin 53912 -> 0 bytes .../src/BeamFormer/IntToFloat.cl-0.ptx | 82 -- .../GPUProc/src/BeamFormer/Transpose.cl-0.ptx | 134 ---- RTCP/GPUProc/src/CL/cl.hpp | 14 +- RTCP/GPUProc/src/Correlator.cl | 10 +- RTCP/GPUProc/src/Correlator.cl-0.ptx | Bin 234324 -> 0 bytes RTCP/GPUProc/src/DelayAndBandPass.cl-0.ptx | Bin 50580 -> 0 bytes RTCP/GPUProc/src/FIR.cl-0.ptx | Bin 92104 -> 0 bytes RTCP/GPUProc/src/FilterBank.cc | 213 ++--- RTCP/GPUProc/src/NewCorrelator.cl | 551 +++++++++++-- RTCP/GPUProc/src/NewCorrelator.cl-0.ptx | Bin 43272 -> 0 bytes RTCP/GPUProc/src/RTCP.cc | 470 +++++++---- RTCP/GPUProc/src/UHEP/BeamFormer.cl-0.ptx | 207 ----- RTCP/GPUProc/src/UHEP/BeamFormer.cl.hop-0.ptx | Bin 53640 -> 0 bytes RTCP/GPUProc/src/UHEP/InvFFT.cl-0.ptx | 759 ------------------ RTCP/GPUProc/src/UHEP/InvFIR.cl-0.ptx | 447 ----------- RTCP/GPUProc/src/UHEP/Transpose.cl-0.ptx | 142 ---- RTCP/GPUProc/src/UHEP/Trigger.cl-0.ptx | 511 ------------ RTCP/GPUProc/src/octave-core | Bin 96 -> 0 bytes 23 files changed, 933 insertions(+), 3648 deletions(-) delete mode 100644 RTCP/GPUProc/src/BeamFormer/BeamFormer.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/BeamFormer/CoherentStokes.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/BeamFormer/Dedispersion.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/BeamFormer/IncoherentStokes.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/BeamFormer/IntToFloat.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/BeamFormer/Transpose.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/Correlator.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/DelayAndBandPass.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/FIR.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/NewCorrelator.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/UHEP/BeamFormer.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/UHEP/BeamFormer.cl.hop-0.ptx delete mode 100644 RTCP/GPUProc/src/UHEP/InvFFT.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/UHEP/InvFIR.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/UHEP/Transpose.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/UHEP/Trigger.cl-0.ptx delete mode 100644 RTCP/GPUProc/src/octave-core diff --git a/.gitattributes b/.gitattributes index 487a7678f0b..48ca44cd2d8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3657,7 +3657,6 @@ RTCP/GPUProc/src/Align.h -text RTCP/GPUProc/src/BandPass.cc -text RTCP/GPUProc/src/BandPass.h -text RTCP/GPUProc/src/BeamFormer/BeamFormer.cl -text -RTCP/GPUProc/src/BeamFormer/BeamFormer.cl-0.ptx -text RTCP/GPUProc/src/BeamFormer/BeamFormer.cl.4x3 -text RTCP/GPUProc/src/BeamFormer/BeamFormer.cl.6x3 -text RTCP/GPUProc/src/BeamFormer/BeamFormer.cl.bak -text @@ -3665,16 +3664,11 @@ RTCP/GPUProc/src/BeamFormer/BeamFormer.cl.not -text RTCP/GPUProc/src/BeamFormer/BeamFormer.cl.ok -text RTCP/GPUProc/src/BeamFormer/BeamFormer.cl.orig -text RTCP/GPUProc/src/BeamFormer/CoherentStokes.cl -text -RTCP/GPUProc/src/BeamFormer/CoherentStokes.cl-0.ptx -text RTCP/GPUProc/src/BeamFormer/CoherentStokes.cl.ok -text RTCP/GPUProc/src/BeamFormer/Dedispersion.cl -text -RTCP/GPUProc/src/BeamFormer/Dedispersion.cl-0.ptx -text RTCP/GPUProc/src/BeamFormer/IncoherentStokes.cl -text -RTCP/GPUProc/src/BeamFormer/IncoherentStokes.cl-0.ptx -text RTCP/GPUProc/src/BeamFormer/IntToFloat.cl -text -RTCP/GPUProc/src/BeamFormer/IntToFloat.cl-0.ptx -text RTCP/GPUProc/src/BeamFormer/Transpose.cl -text -RTCP/GPUProc/src/BeamFormer/Transpose.cl-0.ptx -text RTCP/GPUProc/src/BeamletBuffer.cc -text RTCP/GPUProc/src/BeamletBuffer.h -text RTCP/GPUProc/src/BeamletBufferToComputeNode.cc -text @@ -3682,14 +3676,11 @@ RTCP/GPUProc/src/BeamletBufferToComputeNode.h -text RTCP/GPUProc/src/CL/cl.hpp -text RTCP/GPUProc/src/CMakeLists.txt -text RTCP/GPUProc/src/Correlator.cl -text -RTCP/GPUProc/src/Correlator.cl-0.ptx -text RTCP/GPUProc/src/DelayAndBandPass.cl -text -RTCP/GPUProc/src/DelayAndBandPass.cl-0.ptx -text RTCP/GPUProc/src/Delays.cc -text RTCP/GPUProc/src/Delays.h -text RTCP/GPUProc/src/FFT.cl -text RTCP/GPUProc/src/FIR.cl -text -RTCP/GPUProc/src/FIR.cl-0.ptx -text RTCP/GPUProc/src/FilterBank.cc -text RTCP/GPUProc/src/FilterBank.h -text RTCP/GPUProc/src/InputSection.cc -text @@ -3700,7 +3691,6 @@ RTCP/GPUProc/src/LockedRanges.h -text RTCP/GPUProc/src/LogThread.cc -text RTCP/GPUProc/src/LogThread.h -text RTCP/GPUProc/src/NewCorrelator.cl -text -RTCP/GPUProc/src/NewCorrelator.cl-0.ptx -text RTCP/GPUProc/src/OpenCL_Support.cc -text RTCP/GPUProc/src/OpenCL_Support.h -text RTCP/GPUProc/src/OpenMP_Support.h -text @@ -3714,29 +3704,22 @@ RTCP/GPUProc/src/Scheduling.cc -text RTCP/GPUProc/src/Scheduling.h -text RTCP/GPUProc/src/SlidingPointer.h -text RTCP/GPUProc/src/UHEP/BeamFormer.cl -text -RTCP/GPUProc/src/UHEP/BeamFormer.cl-0.ptx -text RTCP/GPUProc/src/UHEP/BeamFormer.cl.4groups -text RTCP/GPUProc/src/UHEP/BeamFormer.cl.hop -text -RTCP/GPUProc/src/UHEP/BeamFormer.cl.hop-0.ptx -text RTCP/GPUProc/src/UHEP/BeamFormer.cl.not -text RTCP/GPUProc/src/UHEP/BeamFormer.cl.ok -text RTCP/GPUProc/src/UHEP/InvFFT.cl -text -RTCP/GPUProc/src/UHEP/InvFFT.cl-0.ptx -text RTCP/GPUProc/src/UHEP/InvFIR.cl -text -RTCP/GPUProc/src/UHEP/InvFIR.cl-0.ptx -text RTCP/GPUProc/src/UHEP/InvertedStationPPFWeights.cc -text RTCP/GPUProc/src/UHEP/InvertedStationPPFWeights.h -text RTCP/GPUProc/src/UHEP/Transpose.cl -text -RTCP/GPUProc/src/UHEP/Transpose.cl-0.ptx -text RTCP/GPUProc/src/UHEP/Transpose.cl.ok -text RTCP/GPUProc/src/UHEP/Trigger.cl -text -RTCP/GPUProc/src/UHEP/Trigger.cl-0.ptx -text RTCP/GPUProc/src/UHEP/Trigger.cl.8 -text RTCP/GPUProc/src/UHEP/Trigger.cl.ok -text RTCP/GPUProc/src/WallClockTime.h -text RTCP/GPUProc/src/fft2.cl -text RTCP/GPUProc/src/math.cl -text -RTCP/GPUProc/src/octave-core -text RTCP/GPUProc/test/77_Stations.parset -text RTCP/GPUProc/test/AARTFAAC.parset -text RTCP/GPUProc/test/CMakeLists.txt -text diff --git a/RTCP/GPUProc/src/BeamFormer/BeamFormer.cl-0.ptx b/RTCP/GPUProc/src/BeamFormer/BeamFormer.cl-0.ptx deleted file mode 100644 index 7f1d211419f..00000000000 --- a/RTCP/GPUProc/src/BeamFormer/BeamFormer.cl-0.ptx +++ /dev/null @@ -1,607 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Sat Sep 29 10:12:13 2012 (1348906333) -// Driver 304.54 -// - -.version 3.0 -.target sm_30, texmode_independent -.address_size 32 - -.extern .shared .align 16 .b8 shr_4__local[4096]; - -.entry complexVoltages( - .param .u32 .ptr .global .align 1 complexVoltages_param_0, - .param .u32 .ptr .global .align 1 complexVoltages_param_1, - .param .u32 .ptr .global .align 1 complexVoltages_param_2 -) -{ - .reg .f32 %f<1124>; - .reg .pred %p<13>; - .reg .s32 %r<206>; - - - ld.param.u32 %r1, [complexVoltages_param_0]; - ld.param.u32 %r3, [complexVoltages_param_2]; - // inline asm - mov.u32 %r80, %tid.x; - // inline asm - // inline asm - mov.u32 %r81, %tid.y; - // inline asm - // inline asm - mov.u32 %r82, %envreg5; - // inline asm - // inline asm - mov.u32 %r83, %ntid.z; - // inline asm - // inline asm - mov.u32 %r84, %ctaid.z; - // inline asm - // inline asm - mov.u32 %r85, %tid.z; - // inline asm - add.s32 %r87, %r85, %r82; - mad.lo.s32 %r10, %r84, %r83, %r87; - shl.b32 %r88, %r10, 10; - shl.b32 %r89, %r81, 3; - add.s32 %r90, %r88, %r89; - add.s32 %r91, %r3, %r90; - ld.global.v2.f32 {%f1028, %f1029}, [%r91]; - ld.global.v2.f32 {%f1034, %f1035}, [%r91+2097152]; - ld.global.v2.f32 {%f1040, %f1041}, [%r91+4194304]; - ld.global.v2.f32 {%f1046, %f1047}, [%r91+6291456]; - ld.global.v2.f32 {%f1052, %f1053}, [%r91+8388608]; - ld.global.v2.f32 {%f1058, %f1059}, [%r91+10485760]; - ld.global.v2.f32 {%f1064, %f1065}, [%r91+12582912]; - ld.global.v2.f32 {%f1070, %f1071}, [%r91+14680064]; - ld.global.v2.f32 {%f1076, %f1077}, [%r91+16777216]; - ld.global.v2.f32 {%f1082, %f1083}, [%r91+18874368]; - ld.global.v2.f32 {%f1088, %f1089}, [%r91+20971520]; - ld.global.v2.f32 {%f1094, %f1095}, [%r91+23068672]; - ld.global.v2.f32 {%f1100, %f1101}, [%r91+25165824]; - ld.global.v2.f32 {%f1106, %f1107}, [%r91+27262976]; - ld.global.v2.f32 {%f1112, %f1113}, [%r91+29360128]; - ld.global.v2.f32 {%f1118, %f1119}, [%r91+31457280]; - shl.b32 %r92, %r10, 16; - shl.b32 %r93, %r81, 4; - add.s32 %r94, %r92, %r93; - shl.b32 %r95, %r80, 3; - add.s32 %r96, %r94, %r95; - add.s32 %r189, %r1, %r96; - mov.u32 %r97, shr_4__local; - add.s32 %r98, %r97, %r95; - add.s32 %r12, %r98, 2048; - mov.u32 %r182, 0; - -BB0_1: - mov.u32 %r187, %r189; - mov.u32 %r13, %r187; - shl.b32 %r15, %r182, 4; - // inline asm - mov.u32 %r99, %tid.x; - // inline asm - // inline asm - mov.u32 %r100, %tid.y; - // inline asm - shl.b32 %r17, %r100, 1; - add.s32 %r184, %r17, %r99; - setp.gt.u32 %p1, %r184, 255; - @%p1 bra BB0_4; - - add.s32 %r19, %r99, %r17; - and.b32 %r102, %r19, 15; - add.s32 %r20, %r15, %r102; - mov.u32 %r183, 0; - -BB0_3: - mov.u32 %r22, %r184; - add.s32 %r103, %r19, %r183; - and.b32 %r104, %r103, 65520; - shl.b32 %r105, %r104, 16; - ld.param.u32 %r179, [complexVoltages_param_1]; - add.s32 %r106, %r179, %r105; - shl.b32 %r107, %r10, 9; - add.s32 %r108, %r106, %r107; - shl.b32 %r109, %r20, 4; - add.s32 %r110, %r108, %r109; - shl.b32 %r111, %r22, 4; - add.s32 %r113, %r97, %r111; - ld.global.v4.f32 {%f1024, %f1025, %f1026, %f1027}, [%r110]; - st.shared.v4.f32 [%r113], {%f1024, %f1025, %f1026, %f1027}; - add.s32 %r23, %r22, 256; - add.s32 %r183, %r183, 256; - setp.gt.u32 %p2, %r22, -257; - mov.u32 %r184, %r23; - @%p2 bra BB0_3; - -BB0_4: - mov.u32 %r186, %r12; - bar.sync 0; - mov.u32 %r185, 16; - mov.u32 %r188, %r13; - -BB0_5: - mov.u32 %r28, %r188; - ld.shared.v2.f32 {%f798, %f799}, [%r186+-2048]; - mov.f32 %f1, 0f00000000; - fma.rn.ftz.f32 %f802, %f1028, %f798, %f1; - fma.rn.ftz.f32 %f803, %f1028, %f799, %f1; - neg.ftz.f32 %f3, %f799; - fma.rn.ftz.f32 %f810, %f1029, %f3, %f802; - fma.rn.ftz.f32 %f811, %f1029, %f798, %f803; - ld.shared.v2.f32 {%f814, %f815}, [%r186+-1792]; - fma.rn.ftz.f32 %f816, %f1034, %f814, %f810; - fma.rn.ftz.f32 %f817, %f1034, %f815, %f811; - neg.ftz.f32 %f6, %f815; - fma.rn.ftz.f32 %f824, %f1035, %f6, %f816; - fma.rn.ftz.f32 %f825, %f1035, %f814, %f817; - ld.shared.v2.f32 {%f828, %f829}, [%r186+-1536]; - fma.rn.ftz.f32 %f830, %f1040, %f828, %f824; - fma.rn.ftz.f32 %f831, %f1040, %f829, %f825; - neg.ftz.f32 %f9, %f829; - fma.rn.ftz.f32 %f838, %f1041, %f9, %f830; - fma.rn.ftz.f32 %f839, %f1041, %f828, %f831; - ld.shared.v2.f32 {%f842, %f843}, [%r186+-1280]; - fma.rn.ftz.f32 %f844, %f1046, %f842, %f838; - fma.rn.ftz.f32 %f845, %f1046, %f843, %f839; - neg.ftz.f32 %f12, %f843; - fma.rn.ftz.f32 %f852, %f1047, %f12, %f844; - fma.rn.ftz.f32 %f853, %f1047, %f842, %f845; - ld.shared.v2.f32 {%f856, %f857}, [%r186+-1024]; - fma.rn.ftz.f32 %f858, %f1052, %f856, %f852; - fma.rn.ftz.f32 %f859, %f1052, %f857, %f853; - neg.ftz.f32 %f15, %f857; - fma.rn.ftz.f32 %f866, %f1053, %f15, %f858; - fma.rn.ftz.f32 %f867, %f1053, %f856, %f859; - ld.shared.v2.f32 {%f870, %f871}, [%r186+-768]; - fma.rn.ftz.f32 %f872, %f1058, %f870, %f866; - fma.rn.ftz.f32 %f873, %f1058, %f871, %f867; - neg.ftz.f32 %f18, %f871; - fma.rn.ftz.f32 %f880, %f1059, %f18, %f872; - fma.rn.ftz.f32 %f881, %f1059, %f870, %f873; - ld.shared.v2.f32 {%f884, %f885}, [%r186+-512]; - fma.rn.ftz.f32 %f886, %f1064, %f884, %f880; - fma.rn.ftz.f32 %f887, %f1064, %f885, %f881; - neg.ftz.f32 %f21, %f885; - fma.rn.ftz.f32 %f894, %f1065, %f21, %f886; - fma.rn.ftz.f32 %f895, %f1065, %f884, %f887; - ld.shared.v2.f32 {%f898, %f899}, [%r186+-256]; - fma.rn.ftz.f32 %f900, %f1070, %f898, %f894; - fma.rn.ftz.f32 %f901, %f1070, %f899, %f895; - neg.ftz.f32 %f24, %f899; - fma.rn.ftz.f32 %f908, %f1071, %f24, %f900; - fma.rn.ftz.f32 %f909, %f1071, %f898, %f901; - ld.shared.v2.f32 {%f912, %f913}, [%r186]; - fma.rn.ftz.f32 %f914, %f1076, %f912, %f908; - fma.rn.ftz.f32 %f915, %f1076, %f913, %f909; - neg.ftz.f32 %f27, %f913; - fma.rn.ftz.f32 %f922, %f1077, %f27, %f914; - fma.rn.ftz.f32 %f923, %f1077, %f912, %f915; - ld.shared.v2.f32 {%f926, %f927}, [%r186+256]; - fma.rn.ftz.f32 %f928, %f1082, %f926, %f922; - fma.rn.ftz.f32 %f929, %f1082, %f927, %f923; - neg.ftz.f32 %f30, %f927; - fma.rn.ftz.f32 %f936, %f1083, %f30, %f928; - fma.rn.ftz.f32 %f937, %f1083, %f926, %f929; - ld.shared.v2.f32 {%f940, %f941}, [%r186+512]; - fma.rn.ftz.f32 %f942, %f1088, %f940, %f936; - fma.rn.ftz.f32 %f943, %f1088, %f941, %f937; - neg.ftz.f32 %f33, %f941; - fma.rn.ftz.f32 %f950, %f1089, %f33, %f942; - fma.rn.ftz.f32 %f951, %f1089, %f940, %f943; - ld.shared.v2.f32 {%f954, %f955}, [%r186+768]; - fma.rn.ftz.f32 %f956, %f1094, %f954, %f950; - fma.rn.ftz.f32 %f957, %f1094, %f955, %f951; - neg.ftz.f32 %f36, %f955; - fma.rn.ftz.f32 %f964, %f1095, %f36, %f956; - fma.rn.ftz.f32 %f965, %f1095, %f954, %f957; - ld.shared.v2.f32 {%f968, %f969}, [%r186+1024]; - fma.rn.ftz.f32 %f970, %f1100, %f968, %f964; - fma.rn.ftz.f32 %f971, %f1100, %f969, %f965; - neg.ftz.f32 %f39, %f969; - fma.rn.ftz.f32 %f978, %f1101, %f39, %f970; - fma.rn.ftz.f32 %f979, %f1101, %f968, %f971; - ld.shared.v2.f32 {%f982, %f983}, [%r186+1280]; - fma.rn.ftz.f32 %f984, %f1106, %f982, %f978; - fma.rn.ftz.f32 %f985, %f1106, %f983, %f979; - neg.ftz.f32 %f42, %f983; - fma.rn.ftz.f32 %f992, %f1107, %f42, %f984; - fma.rn.ftz.f32 %f993, %f1107, %f982, %f985; - ld.shared.v2.f32 {%f996, %f997}, [%r186+1536]; - fma.rn.ftz.f32 %f998, %f1112, %f996, %f992; - fma.rn.ftz.f32 %f999, %f1112, %f997, %f993; - neg.ftz.f32 %f45, %f997; - fma.rn.ftz.f32 %f1006, %f1113, %f45, %f998; - fma.rn.ftz.f32 %f1007, %f1113, %f996, %f999; - ld.shared.v2.f32 {%f1010, %f1011}, [%r186+1792]; - fma.rn.ftz.f32 %f1012, %f1118, %f1010, %f1006; - fma.rn.ftz.f32 %f1013, %f1118, %f1011, %f1007; - neg.ftz.f32 %f48, %f1011; - fma.rn.ftz.f32 %f1020, %f1119, %f48, %f1012; - fma.rn.ftz.f32 %f1021, %f1119, %f1010, %f1013; - st.global.v2.f32 [%r28], {%f1020, %f1021}; - add.s32 %r29, %r28, 2048; - add.s32 %r186, %r186, 16; - add.s32 %r185, %r185, -1; - setp.ne.s32 %p3, %r185, 0; - mov.u32 %r188, %r29; - @%p3 bra BB0_5; - - bar.sync 0; - add.s32 %r182, %r182, 1; - add.s32 %r33, %r13, 32768; - setp.ne.s32 %p4, %r182, 2; - mov.u32 %r189, %r33; - @%p4 bra BB0_1; - - ld.param.u32 %r181, [complexVoltages_param_2]; - add.s32 %r119, %r181, %r90; - ld.global.v2.f32 {%f702, %f703}, [%r119+33554432]; - ld.global.v2.f32 {%f708, %f709}, [%r119+35651584]; - ld.global.v2.f32 {%f714, %f715}, [%r119+37748736]; - ld.global.v2.f32 {%f720, %f721}, [%r119+39845888]; - ld.global.v2.f32 {%f726, %f727}, [%r119+41943040]; - ld.global.v2.f32 {%f732, %f733}, [%r119+44040192]; - ld.global.v2.f32 {%f738, %f739}, [%r119+46137344]; - ld.global.v2.f32 {%f744, %f745}, [%r119+48234496]; - ld.global.v2.f32 {%f750, %f751}, [%r119+50331648]; - ld.global.v2.f32 {%f756, %f757}, [%r119+52428800]; - ld.global.v2.f32 {%f762, %f763}, [%r119+54525952]; - ld.global.v2.f32 {%f768, %f769}, [%r119+56623104]; - ld.global.v2.f32 {%f774, %f775}, [%r119+58720256]; - ld.global.v2.f32 {%f780, %f781}, [%r119+60817408]; - ld.global.v2.f32 {%f786, %f787}, [%r119+62914560]; - ld.global.v2.f32 {%f792, %f793}, [%r119+65011712]; - ld.param.u32 %r176, [complexVoltages_param_0]; - add.s32 %r197, %r176, %r96; - mov.u32 %r190, 0; - -BB0_8: - mov.u32 %r195, %r197; - mov.u32 %r36, %r195; - shl.b32 %r38, %r190, 4; - // inline asm - mov.u32 %r129, %tid.x; - // inline asm - // inline asm - mov.u32 %r130, %tid.y; - // inline asm - shl.b32 %r40, %r130, 1; - add.s32 %r192, %r40, %r129; - setp.gt.u32 %p5, %r192, 255; - @%p5 bra BB0_11; - - add.s32 %r42, %r129, %r40; - and.b32 %r132, %r42, 15; - add.s32 %r43, %r38, %r132; - mov.u32 %r191, 0; - -BB0_10: - mov.u32 %r45, %r192; - add.s32 %r133, %r42, %r191; - shl.b32 %r134, %r43, 4; - shl.b32 %r135, %r10, 9; - shl.b32 %r136, %r45, 4; - add.s32 %r138, %r97, %r136; - and.b32 %r139, %r133, 65520; - shl.b32 %r140, %r139, 16; - ld.param.u32 %r178, [complexVoltages_param_1]; - add.s32 %r141, %r140, %r178; - add.s32 %r142, %r141, %r135; - add.s32 %r143, %r142, %r134; - ld.global.v4.f32 {%f698, %f699, %f700, %f701}, [%r143+16777216]; - st.shared.v4.f32 [%r138], {%f698, %f699, %f700, %f701}; - add.s32 %r46, %r45, 256; - add.s32 %r191, %r191, 256; - setp.gt.u32 %p6, %r45, -257; - mov.u32 %r192, %r46; - @%p6 bra BB0_10; - -BB0_11: - mov.u32 %r194, %r12; - bar.sync 0; - mov.u32 %r193, 16; - mov.u32 %r196, %r36; - -BB0_12: - mov.u32 %r51, %r196; - ld.shared.v2.f32 {%f472, %f473}, [%r194+-2048]; - ld.global.v2.f32 {%f474, %f475}, [%r51]; - fma.rn.ftz.f32 %f476, %f702, %f472, %f474; - fma.rn.ftz.f32 %f477, %f702, %f473, %f475; - neg.ftz.f32 %f51, %f473; - fma.rn.ftz.f32 %f484, %f703, %f51, %f476; - fma.rn.ftz.f32 %f485, %f703, %f472, %f477; - ld.shared.v2.f32 {%f488, %f489}, [%r194+-1792]; - fma.rn.ftz.f32 %f490, %f708, %f488, %f484; - fma.rn.ftz.f32 %f491, %f708, %f489, %f485; - neg.ftz.f32 %f54, %f489; - fma.rn.ftz.f32 %f498, %f709, %f54, %f490; - fma.rn.ftz.f32 %f499, %f709, %f488, %f491; - ld.shared.v2.f32 {%f502, %f503}, [%r194+-1536]; - fma.rn.ftz.f32 %f504, %f714, %f502, %f498; - fma.rn.ftz.f32 %f505, %f714, %f503, %f499; - neg.ftz.f32 %f57, %f503; - fma.rn.ftz.f32 %f512, %f715, %f57, %f504; - fma.rn.ftz.f32 %f513, %f715, %f502, %f505; - ld.shared.v2.f32 {%f516, %f517}, [%r194+-1280]; - fma.rn.ftz.f32 %f518, %f720, %f516, %f512; - fma.rn.ftz.f32 %f519, %f720, %f517, %f513; - neg.ftz.f32 %f60, %f517; - fma.rn.ftz.f32 %f526, %f721, %f60, %f518; - fma.rn.ftz.f32 %f527, %f721, %f516, %f519; - ld.shared.v2.f32 {%f530, %f531}, [%r194+-1024]; - fma.rn.ftz.f32 %f532, %f726, %f530, %f526; - fma.rn.ftz.f32 %f533, %f726, %f531, %f527; - neg.ftz.f32 %f63, %f531; - fma.rn.ftz.f32 %f540, %f727, %f63, %f532; - fma.rn.ftz.f32 %f541, %f727, %f530, %f533; - ld.shared.v2.f32 {%f544, %f545}, [%r194+-768]; - fma.rn.ftz.f32 %f546, %f732, %f544, %f540; - fma.rn.ftz.f32 %f547, %f732, %f545, %f541; - neg.ftz.f32 %f66, %f545; - fma.rn.ftz.f32 %f554, %f733, %f66, %f546; - fma.rn.ftz.f32 %f555, %f733, %f544, %f547; - ld.shared.v2.f32 {%f558, %f559}, [%r194+-512]; - fma.rn.ftz.f32 %f560, %f738, %f558, %f554; - fma.rn.ftz.f32 %f561, %f738, %f559, %f555; - neg.ftz.f32 %f69, %f559; - fma.rn.ftz.f32 %f568, %f739, %f69, %f560; - fma.rn.ftz.f32 %f569, %f739, %f558, %f561; - ld.shared.v2.f32 {%f572, %f573}, [%r194+-256]; - fma.rn.ftz.f32 %f574, %f744, %f572, %f568; - fma.rn.ftz.f32 %f575, %f744, %f573, %f569; - neg.ftz.f32 %f72, %f573; - fma.rn.ftz.f32 %f582, %f745, %f72, %f574; - fma.rn.ftz.f32 %f583, %f745, %f572, %f575; - ld.shared.v2.f32 {%f586, %f587}, [%r194]; - fma.rn.ftz.f32 %f588, %f750, %f586, %f582; - fma.rn.ftz.f32 %f589, %f750, %f587, %f583; - neg.ftz.f32 %f75, %f587; - fma.rn.ftz.f32 %f596, %f751, %f75, %f588; - fma.rn.ftz.f32 %f597, %f751, %f586, %f589; - ld.shared.v2.f32 {%f600, %f601}, [%r194+256]; - fma.rn.ftz.f32 %f602, %f756, %f600, %f596; - fma.rn.ftz.f32 %f603, %f756, %f601, %f597; - neg.ftz.f32 %f78, %f601; - fma.rn.ftz.f32 %f610, %f757, %f78, %f602; - fma.rn.ftz.f32 %f611, %f757, %f600, %f603; - ld.shared.v2.f32 {%f614, %f615}, [%r194+512]; - fma.rn.ftz.f32 %f616, %f762, %f614, %f610; - fma.rn.ftz.f32 %f617, %f762, %f615, %f611; - neg.ftz.f32 %f81, %f615; - fma.rn.ftz.f32 %f624, %f763, %f81, %f616; - fma.rn.ftz.f32 %f625, %f763, %f614, %f617; - ld.shared.v2.f32 {%f628, %f629}, [%r194+768]; - fma.rn.ftz.f32 %f630, %f768, %f628, %f624; - fma.rn.ftz.f32 %f631, %f768, %f629, %f625; - neg.ftz.f32 %f84, %f629; - fma.rn.ftz.f32 %f638, %f769, %f84, %f630; - fma.rn.ftz.f32 %f639, %f769, %f628, %f631; - ld.shared.v2.f32 {%f642, %f643}, [%r194+1024]; - fma.rn.ftz.f32 %f644, %f774, %f642, %f638; - fma.rn.ftz.f32 %f645, %f774, %f643, %f639; - neg.ftz.f32 %f87, %f643; - fma.rn.ftz.f32 %f652, %f775, %f87, %f644; - fma.rn.ftz.f32 %f653, %f775, %f642, %f645; - ld.shared.v2.f32 {%f656, %f657}, [%r194+1280]; - fma.rn.ftz.f32 %f658, %f780, %f656, %f652; - fma.rn.ftz.f32 %f659, %f780, %f657, %f653; - neg.ftz.f32 %f90, %f657; - fma.rn.ftz.f32 %f666, %f781, %f90, %f658; - fma.rn.ftz.f32 %f667, %f781, %f656, %f659; - ld.shared.v2.f32 {%f670, %f671}, [%r194+1536]; - fma.rn.ftz.f32 %f672, %f786, %f670, %f666; - fma.rn.ftz.f32 %f673, %f786, %f671, %f667; - neg.ftz.f32 %f93, %f671; - fma.rn.ftz.f32 %f680, %f787, %f93, %f672; - fma.rn.ftz.f32 %f681, %f787, %f670, %f673; - ld.shared.v2.f32 {%f684, %f685}, [%r194+1792]; - fma.rn.ftz.f32 %f686, %f792, %f684, %f680; - fma.rn.ftz.f32 %f687, %f792, %f685, %f681; - neg.ftz.f32 %f96, %f685; - fma.rn.ftz.f32 %f694, %f793, %f96, %f686; - fma.rn.ftz.f32 %f695, %f793, %f684, %f687; - st.global.v2.f32 [%r51], {%f694, %f695}; - add.s32 %r52, %r51, 2048; - add.s32 %r194, %r194, 16; - add.s32 %r193, %r193, -1; - setp.ne.s32 %p7, %r193, 0; - mov.u32 %r196, %r52; - @%p7 bra BB0_12; - - bar.sync 0; - add.s32 %r190, %r190, 1; - add.s32 %r56, %r36, 32768; - setp.ne.s32 %p8, %r190, 2; - mov.u32 %r197, %r56; - @%p8 bra BB0_8; - - ld.param.u32 %r180, [complexVoltages_param_2]; - add.s32 %r149, %r180, %r90; - ld.global.v2.f32 {%f376, %f377}, [%r149+67108864]; - ld.global.v2.f32 {%f382, %f383}, [%r149+69206016]; - ld.global.v2.f32 {%f388, %f389}, [%r149+71303168]; - ld.global.v2.f32 {%f394, %f395}, [%r149+73400320]; - ld.global.v2.f32 {%f400, %f401}, [%r149+75497472]; - ld.global.v2.f32 {%f406, %f407}, [%r149+77594624]; - ld.global.v2.f32 {%f412, %f413}, [%r149+79691776]; - ld.global.v2.f32 {%f418, %f419}, [%r149+81788928]; - ld.global.v2.f32 {%f424, %f425}, [%r149+83886080]; - ld.global.v2.f32 {%f430, %f431}, [%r149+85983232]; - ld.global.v2.f32 {%f436, %f437}, [%r149+88080384]; - ld.global.v2.f32 {%f442, %f443}, [%r149+90177536]; - ld.global.v2.f32 {%f448, %f449}, [%r149+92274688]; - ld.global.v2.f32 {%f454, %f455}, [%r149+94371840]; - ld.global.v2.f32 {%f460, %f461}, [%r149+96468992]; - ld.global.v2.f32 {%f466, %f467}, [%r149+98566144]; - ld.param.u32 %r175, [complexVoltages_param_0]; - add.s32 %r205, %r175, %r96; - mov.u32 %r198, 0; - -BB0_15: - mov.u32 %r203, %r205; - mov.u32 %r59, %r203; - shl.b32 %r61, %r198, 4; - // inline asm - mov.u32 %r159, %tid.x; - // inline asm - // inline asm - mov.u32 %r160, %tid.y; - // inline asm - shl.b32 %r63, %r160, 1; - add.s32 %r200, %r63, %r159; - setp.gt.u32 %p9, %r200, 255; - @%p9 bra BB0_18; - - add.s32 %r65, %r159, %r63; - and.b32 %r162, %r65, 15; - add.s32 %r66, %r61, %r162; - mov.u32 %r199, 0; - -BB0_17: - mov.u32 %r68, %r200; - add.s32 %r163, %r65, %r199; - shl.b32 %r164, %r66, 4; - shl.b32 %r165, %r10, 9; - shl.b32 %r166, %r68, 4; - add.s32 %r168, %r97, %r166; - and.b32 %r169, %r163, 65520; - shl.b32 %r170, %r169, 16; - ld.param.u32 %r177, [complexVoltages_param_1]; - add.s32 %r171, %r170, %r177; - add.s32 %r172, %r171, %r165; - add.s32 %r173, %r172, %r164; - ld.global.v4.f32 {%f372, %f373, %f374, %f375}, [%r173+33554432]; - st.shared.v4.f32 [%r168], {%f372, %f373, %f374, %f375}; - add.s32 %r69, %r68, 256; - add.s32 %r199, %r199, 256; - setp.gt.u32 %p10, %r68, -257; - mov.u32 %r200, %r69; - @%p10 bra BB0_17; - -BB0_18: - mov.u32 %r202, %r12; - bar.sync 0; - mov.u32 %r201, 16; - mov.u32 %r204, %r59; - -BB0_19: - mov.u32 %r74, %r204; - ld.shared.v2.f32 {%f146, %f147}, [%r202+-2048]; - ld.global.v2.f32 {%f148, %f149}, [%r74]; - fma.rn.ftz.f32 %f150, %f376, %f146, %f148; - fma.rn.ftz.f32 %f151, %f376, %f147, %f149; - neg.ftz.f32 %f99, %f147; - fma.rn.ftz.f32 %f158, %f377, %f99, %f150; - fma.rn.ftz.f32 %f159, %f377, %f146, %f151; - ld.shared.v2.f32 {%f162, %f163}, [%r202+-1792]; - fma.rn.ftz.f32 %f164, %f382, %f162, %f158; - fma.rn.ftz.f32 %f165, %f382, %f163, %f159; - neg.ftz.f32 %f102, %f163; - fma.rn.ftz.f32 %f172, %f383, %f102, %f164; - fma.rn.ftz.f32 %f173, %f383, %f162, %f165; - ld.shared.v2.f32 {%f176, %f177}, [%r202+-1536]; - fma.rn.ftz.f32 %f178, %f388, %f176, %f172; - fma.rn.ftz.f32 %f179, %f388, %f177, %f173; - neg.ftz.f32 %f105, %f177; - fma.rn.ftz.f32 %f186, %f389, %f105, %f178; - fma.rn.ftz.f32 %f187, %f389, %f176, %f179; - ld.shared.v2.f32 {%f190, %f191}, [%r202+-1280]; - fma.rn.ftz.f32 %f192, %f394, %f190, %f186; - fma.rn.ftz.f32 %f193, %f394, %f191, %f187; - neg.ftz.f32 %f108, %f191; - fma.rn.ftz.f32 %f200, %f395, %f108, %f192; - fma.rn.ftz.f32 %f201, %f395, %f190, %f193; - ld.shared.v2.f32 {%f204, %f205}, [%r202+-1024]; - fma.rn.ftz.f32 %f206, %f400, %f204, %f200; - fma.rn.ftz.f32 %f207, %f400, %f205, %f201; - neg.ftz.f32 %f111, %f205; - fma.rn.ftz.f32 %f214, %f401, %f111, %f206; - fma.rn.ftz.f32 %f215, %f401, %f204, %f207; - ld.shared.v2.f32 {%f218, %f219}, [%r202+-768]; - fma.rn.ftz.f32 %f220, %f406, %f218, %f214; - fma.rn.ftz.f32 %f221, %f406, %f219, %f215; - neg.ftz.f32 %f114, %f219; - fma.rn.ftz.f32 %f228, %f407, %f114, %f220; - fma.rn.ftz.f32 %f229, %f407, %f218, %f221; - ld.shared.v2.f32 {%f232, %f233}, [%r202+-512]; - fma.rn.ftz.f32 %f234, %f412, %f232, %f228; - fma.rn.ftz.f32 %f235, %f412, %f233, %f229; - neg.ftz.f32 %f117, %f233; - fma.rn.ftz.f32 %f242, %f413, %f117, %f234; - fma.rn.ftz.f32 %f243, %f413, %f232, %f235; - ld.shared.v2.f32 {%f246, %f247}, [%r202+-256]; - fma.rn.ftz.f32 %f248, %f418, %f246, %f242; - fma.rn.ftz.f32 %f249, %f418, %f247, %f243; - neg.ftz.f32 %f120, %f247; - fma.rn.ftz.f32 %f256, %f419, %f120, %f248; - fma.rn.ftz.f32 %f257, %f419, %f246, %f249; - ld.shared.v2.f32 {%f260, %f261}, [%r202]; - fma.rn.ftz.f32 %f262, %f424, %f260, %f256; - fma.rn.ftz.f32 %f263, %f424, %f261, %f257; - neg.ftz.f32 %f123, %f261; - fma.rn.ftz.f32 %f270, %f425, %f123, %f262; - fma.rn.ftz.f32 %f271, %f425, %f260, %f263; - ld.shared.v2.f32 {%f274, %f275}, [%r202+256]; - fma.rn.ftz.f32 %f276, %f430, %f274, %f270; - fma.rn.ftz.f32 %f277, %f430, %f275, %f271; - neg.ftz.f32 %f126, %f275; - fma.rn.ftz.f32 %f284, %f431, %f126, %f276; - fma.rn.ftz.f32 %f285, %f431, %f274, %f277; - ld.shared.v2.f32 {%f288, %f289}, [%r202+512]; - fma.rn.ftz.f32 %f290, %f436, %f288, %f284; - fma.rn.ftz.f32 %f291, %f436, %f289, %f285; - neg.ftz.f32 %f129, %f289; - fma.rn.ftz.f32 %f298, %f437, %f129, %f290; - fma.rn.ftz.f32 %f299, %f437, %f288, %f291; - ld.shared.v2.f32 {%f302, %f303}, [%r202+768]; - fma.rn.ftz.f32 %f304, %f442, %f302, %f298; - fma.rn.ftz.f32 %f305, %f442, %f303, %f299; - neg.ftz.f32 %f132, %f303; - fma.rn.ftz.f32 %f312, %f443, %f132, %f304; - fma.rn.ftz.f32 %f313, %f443, %f302, %f305; - ld.shared.v2.f32 {%f316, %f317}, [%r202+1024]; - fma.rn.ftz.f32 %f318, %f448, %f316, %f312; - fma.rn.ftz.f32 %f319, %f448, %f317, %f313; - neg.ftz.f32 %f135, %f317; - fma.rn.ftz.f32 %f326, %f449, %f135, %f318; - fma.rn.ftz.f32 %f327, %f449, %f316, %f319; - ld.shared.v2.f32 {%f330, %f331}, [%r202+1280]; - fma.rn.ftz.f32 %f332, %f454, %f330, %f326; - fma.rn.ftz.f32 %f333, %f454, %f331, %f327; - neg.ftz.f32 %f138, %f331; - fma.rn.ftz.f32 %f340, %f455, %f138, %f332; - fma.rn.ftz.f32 %f341, %f455, %f330, %f333; - ld.shared.v2.f32 {%f344, %f345}, [%r202+1536]; - fma.rn.ftz.f32 %f346, %f460, %f344, %f340; - fma.rn.ftz.f32 %f347, %f460, %f345, %f341; - neg.ftz.f32 %f141, %f345; - fma.rn.ftz.f32 %f354, %f461, %f141, %f346; - fma.rn.ftz.f32 %f355, %f461, %f344, %f347; - ld.shared.v2.f32 {%f358, %f359}, [%r202+1792]; - fma.rn.ftz.f32 %f360, %f466, %f358, %f354; - fma.rn.ftz.f32 %f361, %f466, %f359, %f355; - neg.ftz.f32 %f144, %f359; - fma.rn.ftz.f32 %f368, %f467, %f144, %f360; - fma.rn.ftz.f32 %f369, %f467, %f358, %f361; - st.global.v2.f32 [%r74], {%f368, %f369}; - add.s32 %r75, %r74, 2048; - add.s32 %r202, %r202, 16; - add.s32 %r201, %r201, -1; - setp.ne.s32 %p11, %r201, 0; - mov.u32 %r204, %r75; - @%p11 bra BB0_19; - - bar.sync 0; - add.s32 %r198, %r198, 1; - add.s32 %r79, %r59, 32768; - setp.ne.s32 %p12, %r198, 2; - mov.u32 %r205, %r79; - @%p12 bra BB0_15; - - ret; -} - - diff --git a/RTCP/GPUProc/src/BeamFormer/CoherentStokes.cl-0.ptx b/RTCP/GPUProc/src/BeamFormer/CoherentStokes.cl-0.ptx deleted file mode 100644 index 95682a21f13f73a46e51290282c947066bcf9e94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29008 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 diff --git a/RTCP/GPUProc/src/BeamFormer/Dedispersion.cl-0.ptx b/RTCP/GPUProc/src/BeamFormer/Dedispersion.cl-0.ptx deleted file mode 100644 index 221a542fb5f..00000000000 --- a/RTCP/GPUProc/src/BeamFormer/Dedispersion.cl-0.ptx +++ /dev/null @@ -1,417 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Sat Sep 29 10:12:13 2012 (1348906333) -// Driver 304.54 -// - -.version 3.0 -.target sm_30, texmode_independent -.address_size 32 - -.extern .shared .align 4 .b8 shr_2_local_DMs[512]; - -.entry applyChirp( - .param .u32 .ptr .global .align 1 applyChirp_param_0, - .param .u32 .ptr .global .align 4 applyChirp_param_1, - .param .f32 applyChirp_param_2 -) -{ - .reg .f32 %f<225>; - .reg .pred %p<26>; - .reg .s32 %r<97>; - - - // inline asm - mov.u32 %r32, %tid.x; - // inline asm - setp.gt.s32 %p4, %r32, 127; - mov.u32 %r92, %r32; - @%p4 bra BB0_2; - -BB0_1: - shl.b32 %r34, %r92, 2; - ld.param.u32 %r91, [applyChirp_param_1]; - add.s32 %r35, %r91, %r34; - ld.global.f32 %f29, [%r35]; - add.ftz.f32 %f30, %f29, %f29; - mul.ftz.f32 %f31, %f30, 0f40490FDB; - mul.ftz.f32 %f32, %f31, 0f596BD7E5; - mov.u32 %r36, shr_2_local_DMs; - add.s32 %r37, %r36, %r34; - st.shared.f32 [%r37], %f32; - // inline asm - mov.u32 %r33, %ntid.x; - // inline asm - add.s32 %r92, %r33, %r92; - setp.lt.s32 %p5, %r92, 128; - @%p5 bra BB0_1; - -BB0_2: - bar.sync 0; - // inline asm - mov.u32 %r38, %envreg3; - // inline asm - // inline asm - mov.u32 %r39, %ntid.x; - // inline asm - // inline asm - mov.u32 %r40, %ctaid.x; - // inline asm - // inline asm - mov.u32 %r41, %tid.x; - // inline asm - add.s32 %r50, %r41, %r38; - mad.lo.s32 %r51, %r40, %r39, %r50; - // inline asm - mov.u32 %r42, %envreg4; - // inline asm - // inline asm - mov.u32 %r43, %ntid.y; - // inline asm - // inline asm - mov.u32 %r44, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r45, %tid.y; - // inline asm - // inline asm - mov.u32 %r46, %envreg5; - // inline asm - // inline asm - mov.u32 %r47, %ntid.z; - // inline asm - // inline asm - mov.u32 %r48, %ctaid.z; - // inline asm - // inline asm - mov.u32 %r49, %tid.z; - // inline asm - add.s32 %r52, %r49, %r46; - mad.lo.s32 %r53, %r48, %r47, %r52; - cvt.rn.f32.u32 %f35, %r53; - ld.param.f32 %f217, [applyChirp_param_2]; - add.ftz.f32 %f36, %f217, 0fC7BEBC20; - fma.rn.ftz.f32 %f2, %f35, 0f42BEBC20, %f36; - cvt.rn.f32.u32 %f37, %r51; - mul.ftz.f32 %f38, %f37, 0f403EBC20; - setp.gt.u32 %p6, %r51, 32; - fma.rn.ftz.f32 %f39, %f37, 0f403EBC20, 0fC2BEBC20; - selp.f32 %f3, %f39, %f38, %p6; - div.rn.ftz.f32 %f34, %f3, 0f42334A70; - // inline asm - abs.f32 %f33, %f34; - // inline asm - setp.eq.ftz.f32 %p7, %f34, 0f3F800000; - @%p7 bra BB0_25; - - setp.nan.ftz.f32 %p8, %f34, %f34; - @%p8 bra BB0_24; - - mov.f32 %f6, 0fFF800000; - mov.f32 %f220, 0f42A00000; - mov.f32 %f44, 0f3F000000; - mul.rn.f32 %f41, %f44, %f220; - // inline asm - cvt.rmi.f32.f32 %f40, %f41; - // inline asm - mov.f32 %f45, 0f40000000; - mul.rn.f32 %f46, %f45, %f40; - sub.ftz.f32 %f47, %f220, %f46; - setp.eq.ftz.f32 %p1, %f47, 0f3F800000; - // inline asm - cvt.rzi.f32.f32 %f42, %f220; - // inline asm - setp.eq.ftz.f32 %p2, %f42, 0f42A00000; - and.pred %p3, %p1, %p2; - setp.eq.ftz.f32 %p9, %f33, 0f00000000; - @%p9 bra BB0_23; - - setp.eq.ftz.f32 %p10, %f34, 0f7F800000; - setp.eq.ftz.f32 %p11, %f34, %f6; - or.pred %p12, %p10, %p11; - @%p12 bra BB0_20; - - setp.geu.ftz.f32 %p13, %f34, 0f00000000; - @%p13 bra BB0_8; - - mov.f32 %f49, 0f42A00000; - // inline asm - cvt.rzi.f32.f32 %f48, %f49; - // inline asm - setp.neu.ftz.f32 %p14, %f48, 0f42A00000; - @%p14 bra BB0_19; - -BB0_8: - // inline asm - abs.f32 %f50, %f34; - // inline asm - mov.b32 %r18, %f50; - shr.u32 %r54, %r18, 23; - and.b32 %r55, %r54, 255; - add.s32 %r93, %r55, -127; - setp.eq.s32 %p15, %r55, 0; - mov.f32 %f218, %f50; - @%p15 bra BB0_9; - bra.uni BB0_10; - -BB0_9: - and.b32 %r56, %r18, -2139095041; - or.b32 %r57, %r56, 1065353216; - mov.b32 %f52, %r57; - add.ftz.f32 %f53, %f52, 0fBF800000; - mov.b32 %r58, %f53; - shr.u32 %r59, %r58, 23; - and.b32 %r60, %r59, 255; - add.s32 %r93, %r60, -253; - and.b32 %r61, %r58, -2139095041; - or.b32 %r62, %r61, 1065353216; - mov.b32 %f218, %r62; - -BB0_10: - mov.b32 %r63, %f218; - and.b32 %r64, %r63, -2139095041; - or.b32 %r65, %r64, 1065353216; - mov.b32 %f219, %r65; - setp.gt.ftz.f32 %p16, %f219, 0f3FB504F3; - @%p16 bra BB0_11; - bra.uni BB0_12; - -BB0_11: - mul.rn.f32 %f219, %f219, %f44; - add.s32 %r93, %r93, 1; - -BB0_12: - add.ftz.f32 %f63, %f219, 0f3F800000; - rcp.approx.ftz.f32 %f57, %f63; - add.ftz.f32 %f56, %f219, 0fBF800000; - // inline asm - mul.rz.f32 %f55, %f56, %f57; - // inline asm - mul.rn.f32 %f65, %f45, %f55; - mul.rn.f32 %f66, %f65, %f65; - mov.f32 %f67, 0f3B18F0FE; - mul.rn.f32 %f68, %f67, %f66; - add.ftz.f32 %f69, %f68, 0f3C4CAF63; - mul.rn.f32 %f70, %f69, %f66; - add.ftz.f32 %f71, %f70, 0f3DAAAABD; - mul.rn.f32 %f72, %f71, %f66; - mul.rn.f32 %f60, %f72, %f65; - mov.b32 %r66, %f65; - and.b32 %r67, %r66, -4096; - mov.b32 %f73, %r67; - mov.b32 %r68, %f56; - and.b32 %r69, %r68, -4096; - mov.b32 %f74, %r69; - sub.ftz.f32 %f75, %f56, %f73; - mul.rn.f32 %f76, %f45, %f75; - sub.ftz.f32 %f77, %f56, %f74; - mul.rn.f32 %f78, %f73, %f74; - sub.ftz.f32 %f79, %f76, %f78; - mul.rn.f32 %f80, %f73, %f77; - sub.ftz.f32 %f81, %f79, %f80; - mul.rn.f32 %f82, %f57, %f81; - add.ftz.f32 %f83, %f73, %f82; - sub.ftz.f32 %f84, %f83, %f73; - sub.ftz.f32 %f85, %f82, %f84; - add.ftz.f32 %f86, %f83, %f60; - neg.ftz.f32 %f59, %f60; - // inline asm - add.rz.f32 %f58, %f59, %f60; - // inline asm - add.ftz.f32 %f87, %f58, %f85; - add.ftz.f32 %f88, %f86, %f87; - sub.ftz.f32 %f89, %f87, %f87; - cvt.rn.f32.s32 %f90, %r93; - mov.f32 %f91, 0f3F317200; - mul.rn.f32 %f92, %f90, %f91; - mov.f32 %f93, 0f35BFBE8E; - mul.rn.f32 %f94, %f90, %f93; - add.ftz.f32 %f95, %f92, %f88; - sub.ftz.f32 %f96, %f88, %f88; - add.ftz.f32 %f97, %f96, %f89; - add.ftz.f32 %f98, %f97, %f94; - add.ftz.f32 %f13, %f95, %f98; - sub.ftz.f32 %f14, %f98, %f98; - // inline asm - abs.f32 %f61, %f220; - // inline asm - setp.gt.ftz.f32 %p17, %f61, 0f77F684DF; - @%p17 bra BB0_13; - bra.uni BB0_14; - -BB0_13: - mov.f32 %f100, 0f39000000; - mov.f32 %f101, 0f42A00000; - mul.rn.f32 %f220, %f101, %f100; - -BB0_14: - mov.f32 %f102, 0f45800800; - mul.rn.f32 %f103, %f13, %f102; - sub.ftz.f32 %f104, %f13, %f103; - add.ftz.f32 %f105, %f104, %f103; - sub.ftz.f32 %f106, %f13, %f105; - mul.rn.f32 %f107, %f220, %f102; - sub.ftz.f32 %f108, %f220, %f107; - add.ftz.f32 %f109, %f108, %f107; - sub.ftz.f32 %f110, %f220, %f109; - mul.rn.f32 %f111, %f105, %f109; - mul.rn.f32 %f112, %f13, %f220; - sub.ftz.f32 %f113, %f111, %f112; - mul.rn.f32 %f114, %f105, %f110; - add.ftz.f32 %f115, %f113, %f114; - mul.rn.f32 %f116, %f106, %f109; - add.ftz.f32 %f117, %f115, %f116; - mul.rn.f32 %f118, %f106, %f110; - add.ftz.f32 %f119, %f117, %f118; - mul.rn.f32 %f120, %f14, %f220; - add.ftz.f32 %f121, %f120, %f119; - add.ftz.f32 %f122, %f112, %f121; - sub.ftz.f32 %f17, %f121, %f121; - mov.f32 %f223, %f17; - mov.f32 %f224, %f122; - mov.b32 %r24, %f122; - setp.eq.s32 %p18, %r24, 1118925336; - @%p18 bra BB0_15; - bra.uni BB0_16; - -BB0_15: - add.s32 %r70, %r24, -1; - mov.b32 %f123, %r70; - add.ftz.f32 %f124, %f17, 0f37000000; - mov.f32 %f223, %f124; - mov.f32 %f224, %f123; - -BB0_16: - // inline asm - mul.f32 %f125, %f224, 0f3FB8AA3B;ex2.approx.f32 %f125, %f125; - // inline asm - setp.neu.ftz.f32 %p19, %f125, 0f7F800000; - mov.f32 %f221, %f125; - @%p19 bra BB0_17; - bra.uni BB0_18; - -BB0_17: - // inline asm - mad.f32 %f127, %f125, %f223, %f125; - // inline asm - mov.f32 %f221, %f127; - -BB0_18: - not.pred %p21, %p3; - or.pred %p23, %p13, %p21; - mov.b32 %r71, %f221; - xor.b32 %r72, %r71, -2147483648; - mov.b32 %f131, %r72; - selp.f32 %f222, %f221, %f131, %p23; - bra.uni BB0_26; - -BB0_19: - mov.f32 %f222, 0f7FFFFFFF; - bra.uni BB0_26; - -BB0_20: - mov.b32 %r73, %f34; - setp.lt.s32 %p24, %r73, 0; - @%p24 bra BB0_22; - - mov.f32 %f222, 0f7F800000; - bra.uni BB0_26; - -BB0_22: - selp.f32 %f222, 0fFF800000, 0f7F800000, %p3; - bra.uni BB0_26; - -BB0_23: - mov.b32 %r74, %f34; - and.b32 %r75, %r74, -2147483648; - mov.b32 %f132, %r75; - selp.f32 %f222, %f132, 0f00000000, %p3; - bra.uni BB0_26; - -BB0_24: - add.ftz.f32 %f222, %f34, 0f42A00000; - bra.uni BB0_26; - -BB0_25: - mov.f32 %f222, 0f3F800000; - -BB0_26: - add.ftz.f32 %f135, %f222, 0f3F800000; - // inline asm - rsqrt.approx.f32 %f134, %f135; - // inline asm - mul.ftz.f32 %f136, %f134, 0f42000000; - div.approx.ftz.f32 %f137, %f3, %f2; - mul.ftz.f32 %f138, %f137, %f137; - add.ftz.f32 %f139, %f2, %f3; - div.approx.ftz.f32 %f28, %f138, %f139; - add.s32 %r78, %r45, %r42; - mad.lo.s32 %r79, %r44, %r43, %r78; - shl.b32 %r80, %r79, 8; - shl.b32 %r83, %r53, 8; - add.s32 %r84, %r80, %r83; - shl.b32 %r87, %r51, 3; - add.s32 %r88, %r84, %r87; - ld.param.u32 %r90, [applyChirp_param_0]; - add.s32 %r89, %r88, %r90; - add.s32 %r95, %r89, 1048576; - mov.u32 %r96, 128; - mov.u32 %r94, shr_2_local_DMs; - -BB0_27: - ld.global.v2.f32 {%f181, %f182}, [%r95+-1048576]; - ld.global.v2.f32 {%f183, %f184}, [%r95+-524288]; - ld.shared.f32 %f149, [%r94]; - mul.ftz.f32 %f144, %f149, %f28; - // inline asm - cos.approx.f32 %f141, %f144; - // inline asm - // inline asm - sin.approx.f32 %f143, %f144; - // inline asm - mul.ftz.f32 %f187, %f141, %f136; - mul.ftz.f32 %f188, %f143, %f136; - mul.ftz.f32 %f152, %f187, %f181; - neg.f32 %f155, %f188; - fma.rn.ftz.f32 %f156, %f155, %f182, %f152; - mul.ftz.f32 %f157, %f188, %f181; - fma.rn.ftz.f32 %f158, %f187, %f182, %f157; - st.global.v2.f32 [%r95+-1048576], {%f156, %f158}; - mul.ftz.f32 %f160, %f187, %f183; - fma.rn.ftz.f32 %f162, %f155, %f184, %f160; - mul.ftz.f32 %f163, %f188, %f183; - fma.rn.ftz.f32 %f164, %f187, %f184, %f163; - st.global.v2.f32 [%r95+-524288], {%f162, %f164}; - ld.global.v2.f32 {%f195, %f196}, [%r95]; - ld.global.v2.f32 {%f197, %f198}, [%r95+524288]; - ld.shared.f32 %f165, [%r94+4]; - mul.ftz.f32 %f148, %f165, %f28; - // inline asm - cos.approx.f32 %f145, %f148; - // inline asm - // inline asm - sin.approx.f32 %f147, %f148; - // inline asm - mul.ftz.f32 %f201, %f145, %f136; - mul.ftz.f32 %f202, %f147, %f136; - mul.ftz.f32 %f168, %f201, %f195; - neg.f32 %f171, %f202; - fma.rn.ftz.f32 %f172, %f171, %f196, %f168; - mul.ftz.f32 %f173, %f202, %f195; - fma.rn.ftz.f32 %f174, %f201, %f196, %f173; - st.global.v2.f32 [%r95], {%f172, %f174}; - mul.ftz.f32 %f176, %f201, %f197; - fma.rn.ftz.f32 %f178, %f171, %f198, %f176; - mul.ftz.f32 %f179, %f202, %f197; - fma.rn.ftz.f32 %f180, %f201, %f198, %f179; - st.global.v2.f32 [%r95+524288], {%f178, %f180}; - add.s32 %r95, %r95, 2097152; - add.s32 %r94, %r94, 8; - add.s32 %r96, %r96, -2; - setp.ne.s32 %p25, %r96, 0; - @%p25 bra BB0_27; - - ret; -} - - diff --git a/RTCP/GPUProc/src/BeamFormer/IncoherentStokes.cl-0.ptx b/RTCP/GPUProc/src/BeamFormer/IncoherentStokes.cl-0.ptx deleted file mode 100644 index be0613c10bbe025940d0054bfd9e8579149984e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53912 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�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 Kt$S4{iu`~6Nw-`8 diff --git a/RTCP/GPUProc/src/BeamFormer/IntToFloat.cl-0.ptx b/RTCP/GPUProc/src/BeamFormer/IntToFloat.cl-0.ptx deleted file mode 100644 index ce5c60b9ac9..00000000000 --- a/RTCP/GPUProc/src/BeamFormer/IntToFloat.cl-0.ptx +++ /dev/null @@ -1,82 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Sat Sep 29 10:12:13 2012 (1348906333) -// Driver 304.54 -// - -.version 3.0 -.target sm_30, texmode_independent -.address_size 32 - - -.entry intToFloat( - .param .u32 .ptr .global .align 1 intToFloat_param_0, - .param .u32 .ptr .global .align 1 intToFloat_param_1 -) -{ - .reg .f32 %f<9>; - .reg .pred %p<3>; - .reg .s32 %r<25>; - .reg .s16 %rc<9>; - - - // inline asm - mov.u32 %r7, %envreg4; - // inline asm - // inline asm - mov.u32 %r8, %ntid.y; - // inline asm - // inline asm - mov.u32 %r9, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r10, %tid.y; - // inline asm - add.s32 %r12, %r10, %r7; - mad.lo.s32 %r3, %r9, %r8, %r12; - // inline asm - mov.u32 %r11, %tid.x; - // inline asm - setp.gt.u32 %p1, %r11, 65535; - mov.u32 %r24, %r11; - @%p1 bra BB0_2; - -BB0_1: - shl.b32 %r14, %r3, 18; - ld.param.u32 %r23, [intToFloat_param_1]; - add.s32 %r15, %r23, %r14; - shl.b32 %r16, %r24, 2; - add.s32 %r17, %r15, %r16; - ld.global.v2.u8 {%rc5, %rc6}, [%r17]; - // inline asm - cvt.rn.f32.s8 %f1, %rc5; - // inline asm - // inline asm - cvt.rn.f32.s8 %f2, %rc6; - // inline asm - shl.b32 %r18, %r3, 20; - ld.param.u32 %r22, [intToFloat_param_0]; - add.s32 %r19, %r22, %r18; - shl.b32 %r20, %r24, 3; - add.s32 %r21, %r19, %r20; - st.global.v2.f32 [%r21], {%f1, %f2}; - ld.global.v2.u8 {%rc7, %rc8}, [%r17+2]; - // inline asm - cvt.rn.f32.s8 %f3, %rc7; - // inline asm - // inline asm - cvt.rn.f32.s8 %f4, %rc8; - // inline asm - st.global.v2.f32 [%r21+524288], {%f3, %f4}; - // inline asm - mov.u32 %r13, %ntid.x; - // inline asm - add.s32 %r24, %r13, %r24; - setp.lt.u32 %p2, %r24, 65536; - @%p2 bra BB0_1; - -BB0_2: - ret; -} - - diff --git a/RTCP/GPUProc/src/BeamFormer/Transpose.cl-0.ptx b/RTCP/GPUProc/src/BeamFormer/Transpose.cl-0.ptx deleted file mode 100644 index 26a5c9cca9b..00000000000 --- a/RTCP/GPUProc/src/BeamFormer/Transpose.cl-0.ptx +++ /dev/null @@ -1,134 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Sat Sep 29 10:12:13 2012 (1348906333) -// Driver 304.54 -// - -.version 3.0 -.target sm_30, texmode_independent -.address_size 32 - -.extern .shared .align 16 .b8 shr_3_tmp[4352]; - -.entry transposeComplexVoltages( - .param .u32 .ptr .global .align 1 transposeComplexVoltages_param_0, - .param .u32 .ptr .global .align 1 transposeComplexVoltages_param_1 -) -{ - .reg .f32 %f<65>; - .reg .pred %p<2>; - .reg .s32 %r<58>; - - - ld.param.u32 %r26, [transposeComplexVoltages_param_0]; - ld.param.u32 %r27, [transposeComplexVoltages_param_1]; - // inline asm - mov.u32 %r13, %envreg4; - // inline asm - // inline asm - mov.u32 %r14, %ntid.y; - // inline asm - // inline asm - mov.u32 %r15, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r16, %tid.y; - // inline asm - // inline asm - mov.u32 %r17, %envreg5; - // inline asm - // inline asm - mov.u32 %r18, %ntid.z; - // inline asm - // inline asm - mov.u32 %r19, %ctaid.z; - // inline asm - // inline asm - mov.u32 %r20, %tid.z; - // inline asm - // inline asm - mov.u32 %r21, %tid.x; - // inline asm - // inline asm - mov.u32 %r22, %tid.x; - // inline asm - shr.u32 %r28, %r22, 4; - // inline asm - mov.u32 %r23, %tid.x; - // inline asm - shr.u32 %r29, %r23, 4; - // inline asm - mov.u32 %r24, %tid.x; - // inline asm - and.b32 %r30, %r21, 15; - mov.u32 %r31, shr_3_tmp; - mad.lo.s32 %r32, %r30, 272, %r31; - and.b32 %r33, %r22, -16; - add.s32 %r1, %r32, %r33; - mad.lo.s32 %r34, %r29, 272, %r31; - and.b32 %r35, %r24, 15; - shl.b32 %r36, %r35, 4; - add.s32 %r2, %r34, %r36; - add.s32 %r37, %r20, %r17; - mad.lo.s32 %r38, %r19, %r18, %r37; - shl.b32 %r39, %r38, 4; - add.s32 %r40, %r28, %r39; - shl.b32 %r41, %r40, 16; - add.s32 %r42, %r16, %r13; - mad.lo.s32 %r43, %r15, %r14, %r42; - shl.b32 %r44, %r43, 4; - add.s32 %r45, %r44, %r30; - shl.b32 %r46, %r45, 4; - add.s32 %r47, %r41, %r46; - add.s32 %r48, %r47, %r27; - add.s32 %r56, %r48, 4096; - add.s32 %r49, %r29, %r44; - shl.b32 %r50, %r49, 20; - add.s32 %r51, %r39, %r35; - shl.b32 %r52, %r51, 3; - add.s32 %r53, %r50, %r52; - add.s32 %r54, %r53, %r26; - add.s32 %r55, %r54, 525056; - mov.u32 %r57, 2048; - -BB0_1: - add.s32 %r8, %r56, -4096; - ld.global.v4.f32 {%f61, %f62, %f63, %f64}, [%r56+-4096]; - st.shared.v4.f32 [%r1], {%f61, %f62, %f63, %f64}; - bar.sync 0; - ld.shared.v4.f32 {%f53, %f54, %f55, %f56}, [%r2]; - add.s32 %r9, %r55, -525056; - st.global.v2.f32 [%r55+-525056], {%f53, %f54}; - st.global.v2.f32 [%r55+-768], {%f55, %f56}; - bar.sync 0; - ld.global.v4.f32 {%f49, %f50, %f51, %f52}, [%r8+2048]; - st.shared.v4.f32 [%r1], {%f49, %f50, %f51, %f52}; - bar.sync 0; - ld.shared.v4.f32 {%f41, %f42, %f43, %f44}, [%r2]; - st.global.v2.f32 [%r9+256], {%f41, %f42}; - st.global.v2.f32 [%r9+524544], {%f43, %f44}; - bar.sync 0; - ld.global.v4.f32 {%f37, %f38, %f39, %f40}, [%r8+4096]; - st.shared.v4.f32 [%r1], {%f37, %f38, %f39, %f40}; - bar.sync 0; - ld.shared.v4.f32 {%f29, %f30, %f31, %f32}, [%r2]; - st.global.v2.f32 [%r9+512], {%f29, %f30}; - st.global.v2.f32 [%r9+524800], {%f31, %f32}; - bar.sync 0; - ld.global.v4.f32 {%f25, %f26, %f27, %f28}, [%r8+6144]; - st.shared.v4.f32 [%r1], {%f25, %f26, %f27, %f28}; - bar.sync 0; - ld.shared.v4.f32 {%f17, %f18, %f19, %f20}, [%r2]; - st.global.v2.f32 [%r9+768], {%f17, %f18}; - st.global.v2.f32 [%r9+525056], {%f19, %f20}; - bar.sync 0; - add.s32 %r56, %r56, 8192; - add.s32 %r55, %r55, 1024; - add.s32 %r57, %r57, -4; - setp.ne.s32 %p1, %r57, 0; - @%p1 bra BB0_1; - - ret; -} - - diff --git a/RTCP/GPUProc/src/CL/cl.hpp b/RTCP/GPUProc/src/CL/cl.hpp index 5111f37dc8c..aa2b0bd040f 100644 --- a/RTCP/GPUProc/src/CL/cl.hpp +++ b/RTCP/GPUProc/src/CL/cl.hpp @@ -1,4 +1,4 @@ -#include <iostream> +//#include <iostream> /******************************************************************************* * Copyright (c) 2008-2011 The Khronos Group Inc. * @@ -2069,9 +2069,9 @@ public: { cl_int error; object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); -if (!(flags & CL_MEM_ALLOC_HOST_PTR)) -#pragma omp critical (cout) -std::cout << "A: Allocating " << size << " bytes" << std::endl; +//if (!(flags & CL_MEM_ALLOC_HOST_PTR)) +//#pragma omp critical (cout) +//std::cout << "A: Allocating " << size << " bytes" << std::endl; detail::errHandler(error, __CREATE_BUFFER_ERR); if (err != NULL) { @@ -2090,9 +2090,9 @@ std::cout << "A: Allocating " << size << " bytes" << std::endl; Context context = Context::getDefault(err); object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); -if (!(flags & CL_MEM_ALLOC_HOST_PTR)) -#pragma omp critical (cout) -std::cout << "B: Allocating " << size << " bytes" << std::endl; +//if (!(flags & CL_MEM_ALLOC_HOST_PTR)) +//#pragma omp critical (cout) +//std::cout << "B: Allocating " << size << " bytes" << std::endl; detail::errHandler(error, __CREATE_BUFFER_ERR); if (err != NULL) { diff --git a/RTCP/GPUProc/src/Correlator.cl b/RTCP/GPUProc/src/Correlator.cl index 9ca1ce91620..5d41253f40d 100644 --- a/RTCP/GPUProc/src/Correlator.cl +++ b/RTCP/GPUProc/src/Correlator.cl @@ -1,7 +1,7 @@ #define NR_BASELINES (NR_STATIONS * (NR_STATIONS + 1) / 2) #if NR_STATIONS == 288 -#define BLOCK_SIZE 8 +#define BLOCK_SIZE 6 #elif defined NVIDIA_CUDA && NR_SAMPLES_PER_CHANNEL % 24 == 0 #define BLOCK_SIZE 24 #else @@ -24,7 +24,7 @@ __kernel void correlate(__global void *visibilitiesPtr, __local float samples[4][BLOCK_SIZE][NR_STATIONS | 1]; // avoid power-of-2 uint baseline = get_global_id(0); - uint channel = get_global_id(1); + uint channel = get_global_id(1) + 1; uint stat_0 = convert_uint_rtz(sqrt(convert_float(8 * baseline + 1)) - 0.99999f) / 2; uint stat_A = baseline - stat_0 * (stat_0 + 1) / 2; @@ -84,7 +84,7 @@ __kernel void correlate_2x2(__global void *visibilitiesPtr, __local float4 samples[2][BLOCK_SIZE][(NR_STATIONS + 1) / 2 | 1]; // avoid power-of-2 - uint channel = get_global_id(1); + uint channel = get_global_id(1) + 1; uint block = get_global_id(0); uint x = convert_uint_rtz(sqrt(convert_float(8 * block + 1)) - 0.99999f) / 2; @@ -181,7 +181,7 @@ __kernel void correlate_3x3(__global void *visibilitiesPtr, __local float4 samples[3][BLOCK_SIZE][(NR_STATIONS + 2) / 3 | 1]; // avoid power-of-2 - uint channel = get_global_id(1); + uint channel = get_global_id(1) + 1; uint block = get_global_id(0); uint x = convert_uint_rtz(sqrt(convert_float(8 * block + 1)) - 0.99999f) / 2; @@ -338,7 +338,7 @@ __kernel void correlate_4x4(__global void *visibilitiesPtr, __local float4 samples[4][BLOCK_SIZE][(NR_STATIONS + 3) / 4 | 1]; // avoid power-of-2 - uint channel = get_global_id(1); + uint channel = get_global_id(1) + 1; uint block = get_global_id(0); uint x = convert_uint_rtz(sqrt(convert_float(8 * block + 1)) - 0.99999f) / 2; diff --git a/RTCP/GPUProc/src/Correlator.cl-0.ptx b/RTCP/GPUProc/src/Correlator.cl-0.ptx deleted file mode 100644 index 37d40c5127c10f59970bebd14f4800ba1f03e8a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234324 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≶By8*j+Ixfj) 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	CwoB7)16j_Y%L@1 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 YNIX72-j2LAaAIuC->-~}Iya|(0=7U#QUCw| diff --git a/RTCP/GPUProc/src/DelayAndBandPass.cl-0.ptx b/RTCP/GPUProc/src/DelayAndBandPass.cl-0.ptx deleted file mode 100644 index 765b24b939aaab3b67274c4aedf221c92af81818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50580 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 diff --git a/RTCP/GPUProc/src/FIR.cl-0.ptx b/RTCP/GPUProc/src/FIR.cl-0.ptx deleted file mode 100644 index d1a6fd1785efd5436cb75094fa168a1692b1643d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92104 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 Wa2wwN!R6@}U9QuIXp{bveE%O&fn53k diff --git a/RTCP/GPUProc/src/FilterBank.cc b/RTCP/GPUProc/src/FilterBank.cc index beacf7cbcdf..b33756a68ba 100644 --- a/RTCP/GPUProc/src/FilterBank.cc +++ b/RTCP/GPUProc/src/FilterBank.cc @@ -174,152 +174,155 @@ void FilterBank::interpolate(const double x[], const double y[], unsigned xlen, // but has better stopband characteristics. void FilterBank::generate_fir_filter(unsigned n, double w, const double window[], double result[]) { - // make sure grid is big enough for the window - // the grid must be at least (n+1)/2 - // for all filters where the order is a power of two minus 1, grid_n = n+1; - unsigned grid_n = nextPowerOfTwo(n + 1); +#pragma omp critical (FFTW) + { + // make sure grid is big enough for the window + // the grid must be at least (n+1)/2 + // for all filters where the order is a power of two minus 1, grid_n = n+1; + unsigned grid_n = nextPowerOfTwo(n + 1); - unsigned ramp_n = 2; // grid_n/20; + unsigned ramp_n = 2; // grid_n/20; - // Apply ramps to discontinuities - // this is a low pass filter - // maybe we can omit the "w, 0" point? - // I did observe a small difference - double f[] = { 0.0, w - ramp_n / grid_n / 2.0, w, w + ramp_n / grid_n / 2.0, 1.0 }; - double m[] = { 1.0, 1.0, 0.0, 0.0, 0.0 }; + // Apply ramps to discontinuities + // this is a low pass filter + // maybe we can omit the "w, 0" point? + // I did observe a small difference + double f[] = { 0.0, w - ramp_n / grid_n / 2.0, w, w + ramp_n / grid_n / 2.0, 1.0 }; + double m[] = { 1.0, 1.0, 0.0, 0.0, 0.0 }; - // grid is a 1-D array with grid_n+1 points. Values are 1 in filter passband, 0 otherwise - std::vector<double> grid(grid_n + 1); + // grid is a 1-D array with grid_n+1 points. Values are 1 in filter passband, 0 otherwise + std::vector<double> grid(grid_n + 1); - // interpolate between grid points - interpolate(f, m, 5 /* length of f and m arrays */, grid_n + 1, &grid[0]); + // interpolate between grid points + interpolate(f, m, 5 /* length of f and m arrays */, grid_n + 1, &grid[0]); #if 0 - std::stringstream logStr; - logStr << "interpolated = ["; - for(unsigned i=0; i<grid_n+1; i++) { - logStr << grid[i]; - if(i != grid_n+1-1) logStr << ", "; - } - logStr << "];"; - LOG_DEBUG(logStr.str()); + std::stringstream logStr; + logStr << "interpolated = ["; + for(unsigned i=0; i<grid_n+1; i++) { + logStr << grid[i]; + if(i != grid_n+1-1) logStr << ", "; + } + logStr << "];"; + LOG_DEBUG(logStr.str()); #endif - // the grid we do an ifft on is: - // grid appended with grid_n*2 zeros - // appended with original grid values from indices grid_n..2, i.e., the values in reverse order - // (note, arrays start at 1 in octave!) - // the input for the ifft is of size 4*grid_n - // input = [grid ; zeros(grid_n*2,1) ;grid(grid_n:-1:2)]; + // the grid we do an ifft on is: + // grid appended with grid_n*2 zeros + // appended with original grid values from indices grid_n..2, i.e., the values in reverse order + // (note, arrays start at 1 in octave!) + // the input for the ifft is of size 4*grid_n + // input = [grid ; zeros(grid_n*2,1) ;grid(grid_n:-1:2)]; #if defined HAVE_FFTW3 - fftwf_complex* cinput = (fftwf_complex*) fftwf_malloc(grid_n * 4 * sizeof(fftwf_complex)); - fftwf_complex* coutput = (fftwf_complex*) fftwf_malloc(grid_n * 4 * sizeof(fftwf_complex)); + fftwf_complex* cinput = (fftwf_complex*) fftwf_malloc(grid_n * 4 * sizeof(fftwf_complex)); + fftwf_complex* coutput = (fftwf_complex*) fftwf_malloc(grid_n * 4 * sizeof(fftwf_complex)); #elif defined HAVE_FFTW2 - fftw_complex* cinput = (fftw_complex*) fftw_malloc(grid_n*4*sizeof(fftw_complex)); - fftw_complex* coutput = (fftw_complex*) fftw_malloc(grid_n*4*sizeof(fftw_complex)); + fftw_complex* cinput = (fftw_complex*) fftw_malloc(grid_n*4*sizeof(fftw_complex)); + fftw_complex* coutput = (fftw_complex*) fftw_malloc(grid_n*4*sizeof(fftw_complex)); #endif - if (cinput == NULL || coutput == NULL) { - THROW(GPUProcException, "cannot allocate buffers"); - } + if (cinput == NULL || coutput == NULL) { + THROW(GPUProcException, "cannot allocate buffers"); + } - // wipe imaginary part - for (unsigned i = 0; i < grid_n * 4; i++) { - fftw_imag(cinput[i]) = 0.0; - } + // wipe imaginary part + for (unsigned i = 0; i < grid_n * 4; i++) { + fftw_imag(cinput[i]) = 0.0; + } - // copy first part of grid - for (unsigned i = 0; i < grid_n + 1; i++) { - fftw_real(cinput[i]) = grid[i]; - } + // copy first part of grid + for (unsigned i = 0; i < grid_n + 1; i++) { + fftw_real(cinput[i]) = grid[i]; + } - // append zeros - for (unsigned i = grid_n + 1; i <= grid_n * 3; i++) { - fftw_real(cinput[i]) = 0.0; - } + // append zeros + for (unsigned i = grid_n + 1; i <= grid_n * 3; i++) { + fftw_real(cinput[i]) = 0.0; + } - // now append the grid in reverse order - for (unsigned i = grid_n - 1, index = 0; i >= 1; i --, index ++) { - fftw_real(cinput[grid_n * 3 + 1 + index]) = grid[i]; - } + // now append the grid in reverse order + for (unsigned i = grid_n - 1, index = 0; i >= 1; i --, index ++) { + fftw_real(cinput[grid_n * 3 + 1 + index]) = grid[i]; + } #if 0 - std::stringstream logStr; - logStr << "ifft_in = ["; - for(unsigned i=0; i<grid_n*4; i++) { - logStr << fftw_real(cinput[i]) << " " << fftw_imag(cinput[i]); - if(i != grid_n*4-1) logStr << ", "; - } - logStr << "];"; - LOG_DEBUG(logStr.str()); + std::stringstream logStr; + logStr << "ifft_in = ["; + for(unsigned i=0; i<grid_n*4; i++) { + logStr << fftw_real(cinput[i]) << " " << fftw_imag(cinput[i]); + if(i != grid_n*4-1) logStr << ", "; + } + logStr << "];"; + LOG_DEBUG(logStr.str()); #endif #if defined HAVE_FFTW3 - fftwf_plan plan = fftwf_plan_dft_1d(grid_n * 4, cinput, coutput, FFTW_BACKWARD, FFTW_ESTIMATE); - fftwf_execute(plan); + fftwf_plan plan = fftwf_plan_dft_1d(grid_n * 4, cinput, coutput, FFTW_BACKWARD, FFTW_ESTIMATE); + fftwf_execute(plan); #elif defined HAVE_FFTW2 - fftw_plan plan = fftw_create_plan(grid_n * 4, FFTW_BACKWARD, FFTW_ESTIMATE); - fftw_one(plan, cinput, coutput); + fftw_plan plan = fftw_create_plan(grid_n * 4, FFTW_BACKWARD, FFTW_ESTIMATE); + fftw_one(plan, cinput, coutput); #endif #if 0 - for(unsigned i=0; i<grid_n*4; i++) { - LOG_DEBUG_STR("ifft result [" << i << "] = " << fftw_real(coutput[i]) << " " << fftw_imag(coutput[i])); - } + for(unsigned i=0; i<grid_n*4; i++) { + LOG_DEBUG_STR("ifft result [" << i << "] = " << fftw_real(coutput[i]) << " " << fftw_imag(coutput[i])); + } #endif - // half end - // 1 2 n+1 2(n+1) 3(n+1) 4(n+1) - // x x x x x x x x x # last quarter - // x x x x x x # first quarter + // half end + // 1 2 n+1 2(n+1) 3(n+1) 4(n+1) + // x x x x x x x x x # last quarter + // x x x x x x # first quarter - // last_quarter = b([end-n+1:2:end]); # the size is only 1/8, since we skip half of the elements - // first_quarter = b(2:2:(n+1)); # the size is only 1/8, since we skip half of the elements + // last_quarter = b([end-n+1:2:end]); # the size is only 1/8, since we skip half of the elements + // first_quarter = b(2:2:(n+1)); # the size is only 1/8, since we skip half of the elements - unsigned index = 0; + unsigned index = 0; - for (unsigned i = 4 * grid_n - n; i < 4 * grid_n; i += 2) { - result[index] = fftw_real(coutput[i]); - index++; - } + for (unsigned i = 4 * grid_n - n; i < 4 * grid_n; i += 2) { + result[index] = fftw_real(coutput[i]); + index++; + } - for (unsigned i = 1; i <= n; i += 2) { - result[index] = fftw_real(coutput[i]); - index++; - } + for (unsigned i = 1; i <= n; i += 2) { + result[index] = fftw_real(coutput[i]); + index++; + } #if defined HAVE_FFTW3 - fftwf_destroy_plan(plan); - fftwf_free(cinput); - fftwf_free(coutput); + fftwf_destroy_plan(plan); + fftwf_free(cinput); + fftwf_free(coutput); #elif defined HAVE_FFTW2 - fftw_destroy_plan(plan); - fftw_free(cinput); - fftw_free(coutput); + fftw_destroy_plan(plan); + fftw_free(cinput); + fftw_free(coutput); #endif - // multiply with window - for (unsigned i = 0; i <= n; i++) { - result[i] *= window[i]; - } + // multiply with window + for (unsigned i = 0; i <= n; i++) { + result[i] *= window[i]; + } - // normalize - double factor = result[n / 2]; - for (unsigned i = 0; i <= n; i++) { - result[i] /= factor; - } + // normalize + double factor = result[n / 2]; + for (unsigned i = 0; i <= n; i++) { + result[i] /= factor; + } #if 0 - std::stringstream logStr; - logStr << "result = ["; - for(unsigned i=0; i<=n; i++) { - logStr << result[i]; - if(i != n) logStr << ", "; - } - logStr << "];"; - LOG_DEBUG(logStr.str()); + std::stringstream logStr; + logStr << "result = ["; + for(unsigned i=0; i<=n; i++) { + logStr << result[i]; + if(i != n) logStr << ", "; + } + logStr << "];"; + LOG_DEBUG(logStr.str()); #endif + } } diff --git a/RTCP/GPUProc/src/NewCorrelator.cl b/RTCP/GPUProc/src/NewCorrelator.cl index 307c70f3477..6d4e6ee4bc3 100644 --- a/RTCP/GPUProc/src/NewCorrelator.cl +++ b/RTCP/GPUProc/src/NewCorrelator.cl @@ -1,72 +1,124 @@ #define NR_STATIONS_PER_BLOCK 32 -#define BLOCK_SIZE 8 +#define NR_TIMES_PER_BLOCK 8 #define NR_BASELINES (NR_STATIONS * (NR_STATIONS + 1) / 2) -typedef __global float (*CorrectedDataType)[NR_STATIONS][NR_CHANNELS][NR_SAMPLES_PER_CHANNEL][NR_POLARIZATIONS * 2]; +typedef __global float4 (*CorrectedDataType)[NR_STATIONS][NR_CHANNELS][NR_SAMPLES_PER_CHANNEL]; typedef __global float8 (*VisibilitiesType)[NR_BASELINES][NR_CHANNELS]; -#if 0 -__kernel void correlateTriangles(__global void *visibilitiesPtr, - __global const void *correctedDataPtr -) +__kernel +void correlateTriangleKernel(__global void *visibilitiesPtr, + __global const void *correctedDataPtr) { VisibilitiesType visibilities = (VisibilitiesType) visibilitiesPtr; CorrectedDataType correctedData = (CorrectedDataType) correctedDataPtr; - __local float4 samples[BLOCK_SIZE][NR_STATIONS_PER_BLOCK]; + __local float4 samples[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1]; + uint channel = get_global_id(2) + 1; + uint block = get_global_id(1); + +#if NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 + uint firstStation = block * NR_STATIONS_PER_BLOCK; + uint nrStationsThisBlock = NR_STATIONS_PER_BLOCK; +#else + uint lastStation = block * NR_STATIONS_PER_BLOCK + NR_STATIONS % NR_STATIONS_PER_BLOCK; + uint firstStation = block == 0 ? 0 : lastStation - NR_STATIONS_PER_BLOCK; + uint nrStationsThisBlock = lastStation - firstStation; +#endif - uint triangle = get_global_id(1); - uint channel = get_global_id(2); - uint firstStation = triangle * NR_STATIONS_PER_BLOCK; + uint miniBlock = get_local_id(0); + uint statXoffset = convert_uint_rtz(sqrt(convert_float(8 * miniBlock + 1)) - 0.99999f) / 2; + uint statYoffset = miniBlock - statXoffset * (statXoffset + 1) / 2; - float4 vis_0A_r = (float4) 0, vis_0A_i = (float4) 0; - float4 vis_0B_r = (float4) 0, vis_0B_i = (float4) 0; - float4 vis_1A_r = (float4) 0, vis_1A_i = (float4) 0; - float4 vis_1B_r = (float4) 0, vis_1B_i = (float4) 0; + statXoffset *= 2, statYoffset *= 2; - for (uint major = 0; major < NR_SAMPLES_PER_CHANNEL; major += BLOCK_SIZE) { + float4 vis_0A_r = 0, vis_0A_i = 0; + float4 vis_0B_r = 0, vis_0B_i = 0; + float4 vis_1A_r = 0, vis_1A_i = 0; + float4 vis_1B_r = 0, vis_1B_i = 0; + + bool doCorrelate = statXoffset < nrStationsThisBlock; + + for (uint major = 0; major < NR_SAMPLES_PER_CHANNEL; major += NR_TIMES_PER_BLOCK) { // load data into local memory -#pragma unroll 1 - for (uint i = get_local_id(0); i < BLOCK_SIZE * NR_STATIONS_PER_BLOCK; i += get_local_size(0)) { - uint time = i % BLOCK_SIZE; - uint stat = i / BLOCK_SIZE; + barrier(CLK_LOCAL_MEM_FENCE); - if (firstStation + stat < NR_STATIONS) - samples[time][stat] = (*correctedData)[firstStation + stat][channel][major + time]; + for (uint i = get_local_id(0); i < nrStationsThisBlock * NR_TIMES_PER_BLOCK; i += get_local_size(0)) { + uint time = i % NR_TIMES_PER_BLOCK; + uint stat = i / NR_TIMES_PER_BLOCK; + + samples[stat % 2][time][stat / 2] = (*correctedData)[firstStation + stat][channel][major + time]; } barrier(CLK_LOCAL_MEM_FENCE); - // compute auto-correlations +#pragma unroll 1 + for (uint time = 0; time < NR_TIMES_PER_BLOCK; time ++) { + float4 sample_0, sample_1, sample_A, sample_B; + + if (doCorrelate) { + sample_0 = samples[0][time][statYoffset / 2]; + sample_A = samples[0][time][statXoffset / 2]; + sample_B = samples[1][time][statXoffset / 2]; + sample_1 = samples[1][time][statYoffset / 2]; + + vis_0A_r += sample_0.xxzz * sample_A.xzxz; + vis_0A_i += sample_0.yyww * sample_A.xzxz; + vis_0B_r += sample_0.xxzz * sample_B.xzxz; + vis_0B_i += sample_0.yyww * sample_B.xzxz; + vis_1A_r += sample_1.xxzz * sample_A.xzxz; + vis_1A_i += sample_1.yyww * sample_A.xzxz; + vis_1B_r += sample_1.xxzz * sample_B.xzxz; + vis_1B_i += sample_1.yyww * sample_B.xzxz; - if (firstStation + get_local_id(0) < NR_STATIONS) { - for (time = 0; time + BLOCK_SIZE; time ++) { - float sample = samples[time][get_local_id(0)]; + vis_0A_r += sample_0.yyww * sample_A.ywyw; + vis_0A_i -= sample_0.xxzz * sample_A.ywyw; + vis_0B_r += sample_0.yyww * sample_B.ywyw; + vis_0B_i -= sample_0.xxzz * sample_B.ywyw; + vis_1A_r += sample_1.yyww * sample_A.ywyw; + vis_1A_i -= sample_1.xxzz * sample_A.ywyw; + vis_1B_r += sample_1.yyww * sample_B.ywyw; + vis_1B_i -= sample_1.xxzz * sample_B.ywyw; } + } + } + int statY = firstStation + statYoffset; + uint statX = firstStation + statXoffset; + uint baseline = (statX * (statX + 1) / 2) + statY; - barrier(CLK_LOCAL_MEM_FENCE); + if (statXoffset < nrStationsThisBlock) { + (*visibilities)[baseline ][channel].even = vis_0A_r; + (*visibilities)[baseline ][channel].odd = vis_0A_i; + } + + if (statXoffset < nrStationsThisBlock && statYoffset + 1 < nrStationsThisBlock) { + (*visibilities)[baseline + 1][channel].even = vis_1A_r; + (*visibilities)[baseline + 1][channel].odd = vis_1A_i; + } + + if (statXoffset + 1 < nrStationsThisBlock) { + (*visibilities)[baseline + statX + 1][channel].even = vis_0B_r; + (*visibilities)[baseline + statX + 1][channel].odd = vis_0B_i; + (*visibilities)[baseline + statX + 2][channel].even = vis_1B_r; + (*visibilities)[baseline + statX + 2][channel].odd = vis_1B_i; } } -#endif __kernel __attribute__((reqd_work_group_size(NR_STATIONS_PER_BLOCK * NR_STATIONS_PER_BLOCK / 4, 1, 1))) -void correlateRectangles(__global void *visibilitiesPtr, - __global const void *correctedDataPtr -) +void correlateRectangleKernel(__global void *visibilitiesPtr, + __global const void *correctedDataPtr) { - VisibilitiesType visibilities = (VisibilitiesType) visibilitiesPtr; + VisibilitiesType visibilities = (VisibilitiesType) visibilitiesPtr; CorrectedDataType correctedData = (CorrectedDataType) correctedDataPtr; - __local float4 samplesX[2][BLOCK_SIZE][NR_STATIONS_PER_BLOCK / 2 | 1]; - __local float4 samplesY[2][BLOCK_SIZE][NR_STATIONS_PER_BLOCK / 2 | 1]; + __local float4 samplesX[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1]; + __local float4 samplesY[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1]; uint block = get_global_id(1); - uint channel = get_global_id(2); uint blockX = convert_uint_rtz(sqrt(convert_float(8 * block + 1)) - 0.99999f) / 2; uint blockY = block - blockX * (blockX + 1) / 2; @@ -78,35 +130,291 @@ void correlateRectangles(__global void *visibilitiesPtr, int firstStationY = (blockY - 1) * NR_STATIONS_PER_BLOCK + NR_STATIONS % NR_STATIONS_PER_BLOCK; #endif - uint statXoffset = (get_local_id(0) / (NR_STATIONS_PER_BLOCK / 2)); - uint statYoffset = (get_local_id(0) % (NR_STATIONS_PER_BLOCK / 2)); + uint statXoffset = get_local_id(0) / (NR_STATIONS_PER_BLOCK / 2); + uint statYoffset = get_local_id(0) % (NR_STATIONS_PER_BLOCK / 2); + + float4 vis_0A_r = 0, vis_0A_i = 0; + float4 vis_0B_r = 0, vis_0B_i = 0; + float4 vis_1A_r = 0, vis_1A_i = 0; + float4 vis_1B_r = 0, vis_1B_i = 0; + + uint loadTime = get_local_id(0) % NR_TIMES_PER_BLOCK; + uint loadStat = get_local_id(0) / NR_TIMES_PER_BLOCK; + + bool doCorrelateLower = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + 2 * statYoffset) >= 0; + bool doCorrelateUpper = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + 2 * statYoffset) >= -1; + bool doLoadY = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + loadStat) >= 0; + + uint channel = get_global_id(2) + 1; + + for (uint major = 0; major < NR_SAMPLES_PER_CHANNEL; major += NR_TIMES_PER_BLOCK) { + // load data into local memory + float4 sampleX = (*correctedData)[firstStationX + loadStat][channel][major + loadTime]; + float4 sampleY; + + if (doLoadY) + sampleY = (*correctedData)[firstStationY + loadStat][channel][major + loadTime]; + + barrier(CLK_LOCAL_MEM_FENCE); + + samplesX[loadStat % 2][loadTime][loadStat / 2] = sampleX; + + if (doLoadY) + samplesY[loadStat % 2][loadTime][loadStat / 2] = sampleY; + + barrier(CLK_LOCAL_MEM_FENCE); + +#pragma unroll 1 + for (uint time = 0; time < NR_TIMES_PER_BLOCK; time ++) { + float4 sample_0, sample_1, sample_A, sample_B; + + if (doCorrelateLower) { + sample_0 = samplesY[0][time][statYoffset]; + } + + if (doCorrelateUpper) { + sample_A = samplesX[0][time][statXoffset]; + sample_B = samplesX[1][time][statXoffset]; + sample_1 = samplesY[1][time][statYoffset]; + } + + if (doCorrelateLower) { + vis_0A_r += sample_0.xxzz * sample_A.xzxz; + vis_0A_i += sample_0.yyww * sample_A.xzxz; + vis_0B_r += sample_0.xxzz * sample_B.xzxz; + vis_0B_i += sample_0.yyww * sample_B.xzxz; + vis_0A_r += sample_0.yyww * sample_A.ywyw; + vis_0A_i -= sample_0.xxzz * sample_A.ywyw; + vis_0B_r += sample_0.yyww * sample_B.ywyw; + vis_0B_i -= sample_0.xxzz * sample_B.ywyw; + } + + if (doCorrelateUpper) { + vis_1A_r += sample_1.xxzz * sample_A.xzxz; + vis_1A_i += sample_1.yyww * sample_A.xzxz; + vis_1B_r += sample_1.xxzz * sample_B.xzxz; + vis_1B_i += sample_1.yyww * sample_B.xzxz; + vis_1A_r += sample_1.yyww * sample_A.ywyw; + vis_1A_i -= sample_1.xxzz * sample_A.ywyw; + vis_1B_r += sample_1.yyww * sample_B.ywyw; + vis_1B_i -= sample_1.xxzz * sample_B.ywyw; + } + } + } + + int statY = firstStationY + 2 * statYoffset; + uint statX = firstStationX + 2 * statXoffset; + uint baseline = (statX * (statX + 1) / 2) + statY; + + if (doCorrelateLower) { + (*visibilities)[baseline ][channel].even = vis_0A_r; + (*visibilities)[baseline ][channel].odd = vis_0A_i; + (*visibilities)[baseline + statX + 1][channel].even = vis_0B_r; + (*visibilities)[baseline + statX + 1][channel].odd = vis_0B_i; + } + + if (doCorrelateUpper) { + (*visibilities)[baseline + 1][channel].even = vis_1A_r; + (*visibilities)[baseline + 1][channel].odd = vis_1A_i; + (*visibilities)[baseline + statX + 2][channel].even = vis_1B_r; + (*visibilities)[baseline + statX + 2][channel].odd = vis_1B_i; + } +} + +//////////////////////////////////////////////////////////////////////////////// + +void correlateTriangle(VisibilitiesType visibilities, + CorrectedDataType correctedData, + __local float4 samples[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1], + uint block) +{ + uint channel = get_global_id(2) + 1; + +#if NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 + uint firstStation = block * NR_STATIONS_PER_BLOCK; +#else + int firstStation = (block - 1) * NR_STATIONS_PER_BLOCK + NR_STATIONS % NR_STATIONS_PER_BLOCK; +#endif + + bool doCorrelate = false, doAutoCorrelate = false, doNearAutoCorrelate = false; + uint statXoffset, statYoffset; + + if (get_local_id(0) < 128) { + uint miniBlock = get_local_id(0); + uint miniBlockX = convert_uint_rtz(sqrt(convert_float(8 * miniBlock + 1)) - 0.99999f) / 2; + uint miniBlockY = miniBlock - miniBlockX * (miniBlockX + 1) / 2; + + statXoffset = 2 * miniBlockX + 2; + statYoffset = 2 * miniBlockY; + doCorrelate = statXoffset < NR_STATIONS_PER_BLOCK && (NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStation + statYoffset) >= 0); + } else if (get_local_id(0) < 128 + NR_STATIONS_PER_BLOCK / 2) { + statXoffset = statYoffset = 2 * (get_local_id(0) - 128); + // actually, it is the visibility one right of statXoffset + doNearAutoCorrelate = (int) (firstStation + statXoffset) >= 0; + } else if (get_local_id(0) >= 192 && get_local_id(0) < 192 + NR_STATIONS_PER_BLOCK) { + statXoffset = statYoffset = get_local_id(0) - 192; + doAutoCorrelate = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStation + statYoffset) >= 0; + } float4 vis_0A_r = 0, vis_0A_i = 0; float4 vis_0B_r = 0, vis_0B_i = 0; float4 vis_1A_r = 0, vis_1A_i = 0; float4 vis_1B_r = 0, vis_1B_i = 0; - for (uint major = 0; major < NR_SAMPLES_PER_CHANNEL; major += BLOCK_SIZE) { + uint loadTime = get_local_id(0) % NR_TIMES_PER_BLOCK; + uint loadStat = get_local_id(0) / NR_TIMES_PER_BLOCK; + + bool doLoad = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStation + loadStat) >= 0; + + for (uint major = 0; major < NR_SAMPLES_PER_CHANNEL; major += NR_TIMES_PER_BLOCK) { // load data into local memory - for (uint i = get_local_id(0); i < 4 * BLOCK_SIZE * NR_STATIONS_PER_BLOCK; i += NR_STATIONS_PER_BLOCK * NR_STATIONS_PER_BLOCK / 4) { - uint p = i % 4; - uint time = i / 4 % BLOCK_SIZE; - uint stat = i / 4 / BLOCK_SIZE; + float4 sample; + + if (doLoad) + sample = (*correctedData)[firstStation + loadStat][channel][major + loadTime]; + + barrier(CLK_LOCAL_MEM_FENCE); + + if (doLoad) + samples[loadStat % 2][loadTime][loadStat / 2] = sample; + + barrier(CLK_LOCAL_MEM_FENCE); + +#pragma unroll 1 + for (uint time = 0; time < NR_TIMES_PER_BLOCK; time ++) { + if (doCorrelate) { + float4 sample_0 = samples[0][time][statYoffset / 2]; + float4 sample_A = samples[0][time][statXoffset / 2]; + float4 sample_B = samples[1][time][statXoffset / 2]; + float4 sample_1 = samples[1][time][statYoffset / 2]; + + vis_0A_r += sample_0.xxzz * sample_A.xzxz; + vis_0A_i += sample_0.yyww * sample_A.xzxz; + vis_0B_r += sample_0.xxzz * sample_B.xzxz; + vis_0B_i += sample_0.yyww * sample_B.xzxz; + vis_0A_r += sample_0.yyww * sample_A.ywyw; + vis_0A_i -= sample_0.xxzz * sample_A.ywyw; + vis_0B_r += sample_0.yyww * sample_B.ywyw; + vis_0B_i -= sample_0.xxzz * sample_B.ywyw; + + vis_1A_r += sample_1.xxzz * sample_A.xzxz; + vis_1A_i += sample_1.yyww * sample_A.xzxz; + vis_1B_r += sample_1.xxzz * sample_B.xzxz; + vis_1B_i += sample_1.yyww * sample_B.xzxz; + vis_1A_r += sample_1.yyww * sample_A.ywyw; + vis_1A_i -= sample_1.xxzz * sample_A.ywyw; + vis_1B_r += sample_1.yyww * sample_B.ywyw; + vis_1B_i -= sample_1.xxzz * sample_B.ywyw; + } - ((__local float *) &samplesX[stat % 2][time][stat / 2])[p] = (*correctedData)[firstStationX + stat][channel][major + time][p]; + if (doAutoCorrelate) { + float4 sample_0 = samples[statYoffset % 2][time][statYoffset / 2]; + vis_0A_r.xyw += sample_0.xxz * sample_0.xzz; + vis_0A_i.y += sample_0.y * sample_0.z; + vis_0A_r.xyw += sample_0.yyw * sample_0.yww; + vis_0A_i.y -= sample_0.x * sample_0.w; + } - if (NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + stat) >= 0) - ((__local float *) &samplesY[stat % 2][time][stat / 2])[p] = (*correctedData)[firstStationY + stat][channel][major + time][p]; + if (doNearAutoCorrelate) { + float4 sample_0 = samples[0][time][statYoffset / 2]; + float4 sample_B = samples[1][time][statXoffset / 2]; + vis_0B_r += sample_0.xxzz * sample_B.xzxz; + vis_0B_i += sample_0.yyww * sample_B.xzxz; + vis_0B_r += sample_0.yyww * sample_B.ywyw; + vis_0B_i -= sample_0.xxzz * sample_B.ywyw; + } } + } + + if (doAutoCorrelate) { + vis_0A_r.z = vis_0A_r.y; + vis_0A_i.z = -vis_0A_i.y; + } + + int statY = firstStation + statYoffset; + uint statX = firstStation + statXoffset; + uint baseline = (statX * (statX + 1) / 2) + statY; + + if (doCorrelate || doAutoCorrelate) { + (*visibilities)[baseline ][channel].even = vis_0A_r; + (*visibilities)[baseline ][channel].odd = vis_0A_i; + } + + if (doCorrelate || doNearAutoCorrelate) { + (*visibilities)[baseline + statX + 1][channel].even = vis_0B_r; + (*visibilities)[baseline + statX + 1][channel].odd = vis_0B_i; + } + + if (doCorrelate) { + (*visibilities)[baseline + 1][channel].even = vis_1A_r; + (*visibilities)[baseline + 1][channel].odd = vis_1A_i; + (*visibilities)[baseline + statX + 2][channel].even = vis_1B_r; + (*visibilities)[baseline + statX + 2][channel].odd = vis_1B_i; + } +} + + +void correlateTriangle2(VisibilitiesType visibilities, + CorrectedDataType correctedData, + __local float4 samples[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1], + uint block +) +{ + uint channel = get_global_id(2) + 1; + +#if NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 + uint firstStation = block * NR_STATIONS_PER_BLOCK; + //uint lastStation = firstStation + NR_STATIONS_PER_BLOCK; + uint nrStationsThisBlock = NR_STATIONS_PER_BLOCK; +#else + uint lastStation = block * NR_STATIONS_PER_BLOCK + NR_STATIONS % NR_STATIONS_PER_BLOCK; + uint firstStation = block == 0 ? 0 : lastStation - NR_STATIONS_PER_BLOCK; + uint nrStationsThisBlock = lastStation - firstStation; +#endif + + uint miniBlock = get_local_id(0); + uint statXoffset = convert_uint_rtz(sqrt(convert_float(8 * miniBlock + 1)) - 0.99999f) / 2; + uint statYoffset = miniBlock - statXoffset * (statXoffset + 1) / 2; + + statXoffset *= 2, statYoffset *= 2; + + //bool doCorrelate = statXoffset < nrStationsThisBlock; + + float4 vis_0A_r = 0, vis_0A_i = 0; + float4 vis_0B_r = 0, vis_0B_i = 0; + float4 vis_1A_r = 0, vis_1A_i = 0; + float4 vis_1B_r = 0, vis_1B_i = 0; + + uint loadTime = get_local_id(0) % NR_TIMES_PER_BLOCK; + uint loadStat = get_local_id(0) / NR_TIMES_PER_BLOCK; + + bool doCorrelateLeft = statXoffset < nrStationsThisBlock; + //bool doCorrelateRight = statXoffset + 1 < nrStationsThisBlock; + bool doLoad = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || loadStat < nrStationsThisBlock; + + for (uint major = 0; major < NR_SAMPLES_PER_CHANNEL; major += NR_TIMES_PER_BLOCK) { + // load data into local memory + float4 sample; + + if (doLoad) + sample = (*correctedData)[firstStation + loadStat][channel][major + loadTime]; barrier(CLK_LOCAL_MEM_FENCE); - if (NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + 2 * statYoffset) >= -1) { - for (uint time = 0; time < BLOCK_SIZE; time ++) { - float4 sample_0 = samplesY[0][time][statYoffset]; - float4 sample_A = samplesX[0][time][statXoffset]; - float4 sample_B = samplesX[1][time][statXoffset]; - float4 sample_1 = samplesY[1][time][statYoffset]; + if (doLoad) + samples[loadStat % 2][loadTime][loadStat / 2] = sample; + + barrier(CLK_LOCAL_MEM_FENCE); + +#pragma unroll 1 + for (uint time = 0; time < NR_TIMES_PER_BLOCK; time ++) { + float4 sample_0, sample_1, sample_A, sample_B; + + if (doCorrelateLeft) { + sample_0 = samples[0][time][statYoffset / 2]; + sample_A = samples[0][time][statXoffset / 2]; + sample_B = samples[1][time][statXoffset / 2]; + sample_1 = samples[1][time][statYoffset / 2]; vis_0A_r += sample_0.xxzz * sample_A.xzxz; vis_0A_i += sample_0.yyww * sample_A.xzxz; @@ -127,25 +435,152 @@ void correlateRectangles(__global void *visibilitiesPtr, vis_1B_i -= sample_1.xxzz * sample_B.ywyw; } } + } + + int statY = firstStation + statYoffset; + uint statX = firstStation + statXoffset; + uint baseline = (statX * (statX + 1) / 2) + statY; + + if (statXoffset < nrStationsThisBlock) { + (*visibilities)[baseline ][channel].even = vis_0A_r; + (*visibilities)[baseline ][channel].odd = vis_0A_i; + } + + if (statXoffset < nrStationsThisBlock && statYoffset + 1 < nrStationsThisBlock) { + (*visibilities)[baseline + 1][channel].even = vis_1A_r; + (*visibilities)[baseline + 1][channel].odd = vis_1A_i; + } + + if (statXoffset + 1 < nrStationsThisBlock) { + (*visibilities)[baseline + statX + 1][channel].even = vis_0B_r; + (*visibilities)[baseline + statX + 1][channel].odd = vis_0B_i; + (*visibilities)[baseline + statX + 2][channel].even = vis_1B_r; + (*visibilities)[baseline + statX + 2][channel].odd = vis_1B_i; + } +} + + +void correlateRectangle(VisibilitiesType visibilities, + CorrectedDataType correctedData, + __local float4 samplesX[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1], + __local float4 samplesY[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1], + uint blockX, + uint blockY +) +{ + uint channel = get_global_id(2) + 1; + +#if NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 + uint firstStationX = blockX * NR_STATIONS_PER_BLOCK; + uint firstStationY = blockY * NR_STATIONS_PER_BLOCK; +#else + uint firstStationX = (blockX - 1) * NR_STATIONS_PER_BLOCK + NR_STATIONS % NR_STATIONS_PER_BLOCK; + int firstStationY = (blockY - 1) * NR_STATIONS_PER_BLOCK + NR_STATIONS % NR_STATIONS_PER_BLOCK; +#endif + + uint statXoffset = get_local_id(0) / (NR_STATIONS_PER_BLOCK / 2); + uint statYoffset = get_local_id(0) % (NR_STATIONS_PER_BLOCK / 2); + + float4 vis_0A_r = 0, vis_0A_i = 0; + float4 vis_0B_r = 0, vis_0B_i = 0; + float4 vis_1A_r = 0, vis_1A_i = 0; + float4 vis_1B_r = 0, vis_1B_i = 0; + + uint loadTime = get_local_id(0) % NR_TIMES_PER_BLOCK; + uint loadStat = get_local_id(0) / NR_TIMES_PER_BLOCK; + + bool doCorrelateLower = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + 2 * statYoffset) >= 0; + bool doCorrelateUpper = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + 2 * statYoffset) >= -1; + bool doLoadY = NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || (int) (firstStationY + loadStat) >= 0; + + for (uint major = 0; major < NR_SAMPLES_PER_CHANNEL; major += NR_TIMES_PER_BLOCK) { + // load data into local memory + float4 sampleX = (*correctedData)[firstStationX + loadStat][channel][major + loadTime]; + float4 sampleY; + + if (doLoadY) + sampleY = (*correctedData)[firstStationY + loadStat][channel][major + loadTime]; barrier(CLK_LOCAL_MEM_FENCE); + + samplesX[loadStat % 2][loadTime][loadStat / 2] = sampleX; + + if (doLoadY) + samplesY[loadStat % 2][loadTime][loadStat / 2] = sampleY; + + barrier(CLK_LOCAL_MEM_FENCE); + +#pragma unroll 1 + for (uint time = 0; time < NR_TIMES_PER_BLOCK; time ++) { + float4 sample_0, sample_1, sample_A, sample_B; + + if (doCorrelateLower) { + sample_0 = samplesY[0][time][statYoffset]; + } + + if (doCorrelateUpper) { + sample_A = samplesX[0][time][statXoffset]; + sample_B = samplesX[1][time][statXoffset]; + sample_1 = samplesY[1][time][statYoffset]; + } + + if (doCorrelateLower) { + vis_0A_r += sample_0.xxzz * sample_A.xzxz; + vis_0A_i += sample_0.yyww * sample_A.xzxz; + vis_0B_r += sample_0.xxzz * sample_B.xzxz; + vis_0B_i += sample_0.yyww * sample_B.xzxz; + vis_0A_r += sample_0.yyww * sample_A.ywyw; + vis_0A_i -= sample_0.xxzz * sample_A.ywyw; + vis_0B_r += sample_0.yyww * sample_B.ywyw; + vis_0B_i -= sample_0.xxzz * sample_B.ywyw; + } + + if (doCorrelateUpper) { + vis_1A_r += sample_1.xxzz * sample_A.xzxz; + vis_1A_i += sample_1.yyww * sample_A.xzxz; + vis_1B_r += sample_1.xxzz * sample_B.xzxz; + vis_1B_i += sample_1.yyww * sample_B.xzxz; + vis_1A_r += sample_1.yyww * sample_A.ywyw; + vis_1A_i -= sample_1.xxzz * sample_A.ywyw; + vis_1B_r += sample_1.yyww * sample_B.ywyw; + vis_1B_i -= sample_1.xxzz * sample_B.ywyw; + } + } } int statY = firstStationY + 2 * statYoffset; uint statX = firstStationX + 2 * statXoffset; uint baseline = (statX * (statX + 1) / 2) + statY; - if (NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || statY >= 0) { - (*visibilities)[baseline ][channel].even = vis_0A_r; - (*visibilities)[baseline ][channel].odd = vis_0A_i; - (*visibilities)[baseline + 1][channel].even = vis_1A_r; - (*visibilities)[baseline + 1][channel].odd = vis_1A_i; - } - - if (NR_STATIONS % NR_STATIONS_PER_BLOCK == 0 || statY >= -1) { + if (doCorrelateLower) { + (*visibilities)[baseline ][channel].even = vis_0A_r; + (*visibilities)[baseline ][channel].odd = vis_0A_i; (*visibilities)[baseline + statX + 1][channel].even = vis_0B_r; (*visibilities)[baseline + statX + 1][channel].odd = vis_0B_i; + } + + if (doCorrelateUpper) { + (*visibilities)[baseline + 1][channel].even = vis_1A_r; + (*visibilities)[baseline + 1][channel].odd = vis_1A_i; (*visibilities)[baseline + statX + 2][channel].even = vis_1B_r; (*visibilities)[baseline + statX + 2][channel].odd = vis_1B_i; } } + + +__kernel __attribute__((reqd_work_group_size(NR_STATIONS_PER_BLOCK * NR_STATIONS_PER_BLOCK / 4, 1, 1))) +void correlate(__global void *visibilitiesPtr, + __global const void *correctedDataPtr) +{ + __local float4 samplesX[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1]; + __local float4 samplesY[2][NR_TIMES_PER_BLOCK][NR_STATIONS_PER_BLOCK / 2 | 1]; + + uint block = get_global_id(1); + uint blockX = convert_uint_rtz(sqrt(convert_float(8 * block + 1)) - 0.99999f) / 2; + uint blockY = block - blockX * (blockX + 1) / 2; + + if (blockX == blockY) + correlateTriangle2((VisibilitiesType) visibilitiesPtr, (CorrectedDataType) correctedDataPtr, samplesX, blockX); + else + correlateRectangle((VisibilitiesType) visibilitiesPtr, (CorrectedDataType) correctedDataPtr, samplesX, samplesY, blockX, blockY); +} diff --git a/RTCP/GPUProc/src/NewCorrelator.cl-0.ptx b/RTCP/GPUProc/src/NewCorrelator.cl-0.ptx deleted file mode 100644 index c69f71f47ba5748d5cb342ecbed29c627f766f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43272 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 diff --git a/RTCP/GPUProc/src/RTCP.cc b/RTCP/GPUProc/src/RTCP.cc index 0e6c8b99b67..9c6a8830cdc 100644 --- a/RTCP/GPUProc/src/RTCP.cc +++ b/RTCP/GPUProc/src/RTCP.cc @@ -14,11 +14,11 @@ #include <iostream> #include <sstream> #include <boost/multi_array.hpp> +#include <boost/date_time/posix_time/posix_time.hpp> #include "Align.h" -#include "BandPass.h" #include "ApplCommon/PosixTime.h" -#include <boost/date_time/posix_time/posix_time.hpp> +#include "BandPass.h" #include "Common/LofarLogger.h" #include "Common/SystemUtil.h" #include "FilterBank.h" @@ -30,6 +30,11 @@ #include "UHEP/InvertedStationPPFWeights.h" //#include "clAmdFft/include/clAmdFft.h" +#if defined __linux__ +#include <sched.h> +#include <sys/time.h> +#endif + namespace LOFAR { namespace RTCP { @@ -41,9 +46,7 @@ unsigned nrGPUs; #define NR_TAPS 16 #define NR_STATION_FILTER_TAPS 16 -// the SAP to process (we support only one SAP for now) -#define SAP 0 - +#undef USE_NEW_CORRELATOR #define USE_2X2 #undef USE_CUSTOM_FFT #undef USE_TEST_DATA @@ -81,6 +84,40 @@ double getTime() return now - firstTime; } +#if defined __linux__ + +inline void set_affinity(unsigned device) +{ +#if 0 + static const char mapping[1][12] = { + 0, 1, 2, 3, 8, 9, 10, 11, + }; +#else + static const char mapping[8][12] = { + { 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17, }, + { 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17, }, + { 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17, }, + { 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17, }, + { 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23, }, + { 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23, }, + { 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23, }, + { 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23, }, + }; +#endif + + cpu_set_t set; + + CPU_ZERO(&set); + + for (unsigned coreIndex = 0; coreIndex < 12; coreIndex ++) + CPU_SET(mapping[device][coreIndex], &set); + + if (sched_setaffinity(0, sizeof set, &set) < 0) + perror("sched_setaffinity"); +} + +#endif + class PerformanceCounter { @@ -200,7 +237,7 @@ cl::Program createProgram(const Parset &ps, cl::Context &context, std::vector<cl args << " -DNR_SAMPLES_PER_CHANNEL=" << ps.nrSamplesPerChannel(); args << " -DNR_SAMPLES_PER_SUBBAND=" << ps.nrSamplesPerSubband(); args << " -DNR_BEAMS=" << ps.nrBeams(); - args << " -DNR_TABS=" << ps.nrTABs(SAP); + args << " -DNR_TABS=" << ps.nrTABs(0); args << " -DNR_COHERENT_STOKES=" << ps.nrCoherentStokes(); args << " -DNR_INCOHERENT_STOKES=" << ps.nrIncoherentStokes(); args << " -DCOHERENT_STOKES_TIME_INTEGRATION_FACTOR=" << ps.coherentStokesTimeIntegrationFactor(); @@ -257,6 +294,10 @@ class Pipeline SmartPtr<InputSection<i16complex> > inputSection16; SmartPtr<InputSection<i8complex> > inputSection8; SmartPtr<InputSection<i4complex> > inputSection4; + +#if defined USE_B7015 + OMP_Lock hostToDeviceLock[4], deviceToHostLock[4]; +#endif }; @@ -273,12 +314,12 @@ class CorrelatorPipeline : public Pipeline FilterBank filterBank; cl::Program firFilterProgram, delayAndBandPassProgram, correlatorProgram; +#if defined USE_NEW_CORRELATOR + PerformanceCounter firFilterCounter, delayAndBandPassCounter, correlateTriangleCounter, correlateRectangleCounter, fftCounter; +#else PerformanceCounter firFilterCounter, delayAndBandPassCounter, correlatorCounter, fftCounter; - PerformanceCounter samplesCounter, visibilitiesCounter; - -#if defined USE_B7015 - OMP_Lock hostToDeviceLock[4], deviceToHostLock[4]; #endif + PerformanceCounter samplesCounter, visibilitiesCounter; }; @@ -332,7 +373,12 @@ CorrelatorPipeline::CorrelatorPipeline(const Parset &ps) filterBank(true, NR_TAPS, ps.nrChannelsPerSubband(), KAISER), firFilterCounter("FIR filter"), delayAndBandPassCounter("delay/bp"), +#if defined USE_NEW_CORRELATOR + correlateTriangleCounter("cor.triangle"), + correlateRectangleCounter("cor.rectangle"), +#else correlatorCounter("correlator"), +#endif fftCounter("FFT"), samplesCounter("samples"), visibilitiesCounter("visibilities") @@ -348,8 +394,11 @@ CorrelatorPipeline::CorrelatorPipeline(const Parset &ps) #pragma omp section delayAndBandPassProgram = createProgram("DelayAndBandPass.cl"); #pragma omp section +#if defined USE_NEW_CORRELATOR correlatorProgram = createProgram("NewCorrelator.cl"); - //correlatorProgram = createProgram("Correlator.cl"); +#else + correlatorProgram = createProgram("Correlator.cl"); +#endif } std::cout << "compile time = " << getTime() - startTime << std::endl; @@ -666,7 +715,7 @@ class DelayAndBandPassKernel : public Kernel }; -#if 0 +#if !defined USE_NEW_CORRELATOR class CorrelatorKernel : public Kernel { @@ -714,12 +763,13 @@ class CorrelatorKernel : public Kernel nrThreads = (nrThreads + preferredMultiple - 1) / preferredMultiple * preferredMultiple; //std::cout << "nrBlocks = " << nrBlocks << ", nrPasses = " << nrPasses << ", preferredMultiple = " << preferredMultiple << ", nrThreads = " << nrThreads << std::endl; - globalWorkSize = cl::NDRange(nrPasses * nrThreads, ps.nrChannelsPerSubband()); + unsigned nrUsableChannels = std::max(ps.nrChannelsPerSubband() - 1, 1U); + globalWorkSize = cl::NDRange(nrPasses * nrThreads, nrUsableChannels); localWorkSize = cl::NDRange(nrThreads, 1); - nrOperations = (size_t) ps.nrChannelsPerSubband() * ps.nrBaselines() * ps.nrSamplesPerChannel() * 32; - nrBytesRead = (size_t) nrPasses * ps.nrStations() * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * NR_POLARIZATIONS * sizeof(std::complex<float>); - nrBytesWritten = (size_t) ps.nrBaselines() * ps.nrChannelsPerSubband() * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrOperations = (size_t) nrUsableChannels * ps.nrBaselines() * ps.nrSamplesPerChannel() * 32; + nrBytesRead = (size_t) nrPasses * ps.nrStations() * nrUsableChannels * ps.nrSamplesPerChannel() * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrBytesWritten = (size_t) ps.nrBaselines() * nrUsableChannels * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>); } }; @@ -731,7 +781,7 @@ class CorrelatorKernel : public Kernel CorrelatorKernel(const Parset &ps, cl::CommandQueue &queue, cl::Program &program, cl::Buffer &devVisibilities, cl::Buffer &devCorrectedData) : #if defined USE_2X2 - Kernel(ps, program, "correlateRectangles") + Kernel(ps, program, "correlate") #else #error not implemented #endif @@ -739,17 +789,90 @@ class CorrelatorKernel : public Kernel setArg(0, devVisibilities); setArg(1, devCorrectedData); - unsigned nrRectanglesPerSide = ((ps.nrStations() - 1) / (2 * 16)); + unsigned nrRectanglesPerSide = (ps.nrStations() - 1) / (2 * 16); + unsigned nrRectangles = nrRectanglesPerSide * (nrRectanglesPerSide + 1) / 2; +//#pragma omp critical (cout) + //std::cout << "nrRectangles = " << nrRectangles << std::endl; + + unsigned nrBlocksPerSide = (ps.nrStations() + 2 * 16 - 1) / (2 * 16); + unsigned nrBlocks = nrBlocksPerSide * (nrBlocksPerSide + 1) / 2; +//#pragma omp critical (cout) + //std::cout << "nrBlocks = " << nrBlocks << std::endl; + + unsigned nrUsableChannels = std::max(ps.nrChannelsPerSubband() - 1, 1U); + globalWorkSize = cl::NDRange(16 * 16, nrBlocks, nrUsableChannels); + localWorkSize = cl::NDRange(16 * 16, 1, 1); + + // FIXME + //nrOperations = (size_t) (32 * 32) * nrRectangles * nrUsableChannels * ps.nrSamplesPerChannel() * 32; + nrOperations = (size_t) ps.nrBaselines() * ps.nrSamplesPerSubband() * 32; + nrBytesRead = (size_t) (32 + 32) * nrRectangles * nrUsableChannels * ps.nrSamplesPerChannel() * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrBytesWritten = (size_t) (32 * 32) * nrRectangles * nrUsableChannels * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>); + } +}; + + +class CorrelateRectangleKernel : public Kernel +{ + public: + CorrelateRectangleKernel(const Parset &ps, cl::CommandQueue &queue, cl::Program &program, cl::Buffer &devVisibilities, cl::Buffer &devCorrectedData) + : +#if defined USE_2X2 + Kernel(ps, program, "correlateRectangleKernel") +#else +#error not implemented +#endif + { + setArg(0, devVisibilities); + setArg(1, devCorrectedData); + + unsigned nrRectanglesPerSide = (ps.nrStations() - 1) / (2 * 16); unsigned nrRectangles = nrRectanglesPerSide * (nrRectanglesPerSide + 1) / 2; #pragma omp critical (cout) std::cout << "nrRectangles = " << nrRectangles << std::endl; - globalWorkSize = cl::NDRange(16 * 16, nrRectangles, ps.nrChannelsPerSubband()); + unsigned nrUsableChannels = std::max(ps.nrChannelsPerSubband() - 1, 1U); + globalWorkSize = cl::NDRange(16 * 16, nrRectangles, nrUsableChannels); localWorkSize = cl::NDRange(16 * 16, 1, 1); - nrOperations = (size_t) (32 * 32) * nrRectangles * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * 32; - nrBytesRead = (size_t) (32 + 32) * nrRectangles * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * NR_POLARIZATIONS * sizeof(std::complex<float>); - nrBytesWritten = (size_t) (32 * 32) * nrRectangles * ps.nrChannelsPerSubband() * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrOperations = (size_t) (32 * 32) * nrRectangles * nrUsableChannels * ps.nrSamplesPerChannel() * 32; + nrBytesRead = (size_t) (32 + 32) * nrRectangles * nrUsableChannels * ps.nrSamplesPerChannel() * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrBytesWritten = (size_t) (32 * 32) * nrRectangles * nrUsableChannels * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>); + } +}; + + +class CorrelateTriangleKernel : public Kernel +{ + public: + CorrelateTriangleKernel(const Parset &ps, cl::CommandQueue &queue, cl::Program &program, cl::Buffer &devVisibilities, cl::Buffer &devCorrectedData) + : +#if defined USE_2X2 + Kernel(ps, program, "correlateTriangleKernel") +#else +#error not implemented +#endif + { + setArg(0, devVisibilities); + setArg(1, devCorrectedData); + + unsigned nrTriangles = (ps.nrStations() + 2 * 16 - 1) / (2 * 16); + unsigned nrMiniBlocksPerSide = 16; + unsigned nrMiniBlocks = nrMiniBlocksPerSide * (nrMiniBlocksPerSide + 1) / 2; + size_t preferredMultiple; + getWorkGroupInfo(queue.getInfo<CL_QUEUE_DEVICE>(), CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, &preferredMultiple); + unsigned nrThreads = align(nrMiniBlocks, preferredMultiple); + +#pragma omp critical (cout) + std::cout << "nrTriangles = " << nrTriangles << ", nrMiniBlocks = " << nrMiniBlocks << ", nrThreads = " << nrThreads << std::endl; + + unsigned nrUsableChannels = std::max(ps.nrChannelsPerSubband() - 1, 1U); + globalWorkSize = cl::NDRange(nrThreads, nrTriangles, nrUsableChannels); + localWorkSize = cl::NDRange(nrThreads, 1, 1); + + nrOperations = (size_t) (32 * 32 / 2) * nrTriangles * nrUsableChannels * ps.nrSamplesPerChannel() * 32; + nrBytesRead = (size_t) 32 * nrTriangles * nrUsableChannels * ps.nrSamplesPerChannel() * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrBytesWritten = (size_t) (32 * 32 / 2) * nrTriangles * nrUsableChannels * NR_POLARIZATIONS * NR_POLARIZATIONS * sizeof(std::complex<float>); } }; @@ -815,18 +938,18 @@ class BeamFormerKernel : public Kernel setArg(1, devCorrectedData); setArg(2, devBeamFormerWeights); - globalWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(SAP), ps.nrChannelsPerSubband()); - localWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(SAP), 1); + globalWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(0), ps.nrChannelsPerSubband()); + localWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(0), 1); // FIXME: nrTABs - //queue.enqueueNDRangeKernel(*this, cl::NullRange, cl::NDRange(16, ps.nrTABs(SAP), ps.nrChannelsPerSubband()), cl::NDRange(16, ps.nrTABs(SAP), 1), 0, &event); + //queue.enqueueNDRangeKernel(*this, cl::NullRange, cl::NDRange(16, ps.nrTABs(0), ps.nrChannelsPerSubband()), cl::NDRange(16, ps.nrTABs(0), 1), 0, &event); size_t count = ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * NR_POLARIZATIONS; - size_t nrWeightsBytes = ps.nrStations() * ps.nrTABs(SAP) * ps.nrChannelsPerSubband() * NR_POLARIZATIONS * sizeof(std::complex<float>); + size_t nrWeightsBytes = ps.nrStations() * ps.nrTABs(0) * ps.nrChannelsPerSubband() * NR_POLARIZATIONS * sizeof(std::complex<float>); size_t nrSampleBytesPerPass = count * ps.nrStations() * sizeof(std::complex<float>); - size_t nrComplexVoltagesBytesPerPass = count * ps.nrTABs(SAP) * sizeof(std::complex<float>); + size_t nrComplexVoltagesBytesPerPass = count * ps.nrTABs(0) * sizeof(std::complex<float>); unsigned nrPasses = std::max((ps.nrStations() + 6) / 16, 1U); - nrOperations = count * ps.nrStations() * ps.nrTABs(SAP) * 8; + nrOperations = count * ps.nrStations() * ps.nrTABs(0) * 8; nrBytesRead = nrWeightsBytes + nrSampleBytesPerPass + (nrPasses - 1) * nrComplexVoltagesBytesPerPass; nrBytesWritten = nrPasses * nrComplexVoltagesBytesPerPass; } @@ -844,14 +967,14 @@ class BeamFormerTransposeKernel : public Kernel setArg(0, devTransposedData); setArg(1, devComplexVoltages); - //globalWorkSize = cl::NDRange(256, (ps.nrTABs(SAP) + 15) / 16, (ps.nrChannelsPerSubband() + 15) / 16); - globalWorkSize = cl::NDRange(256, (ps.nrTABs(SAP) + 15) / 16, ps.nrSamplesPerChannel() / 16); + //globalWorkSize = cl::NDRange(256, (ps.nrTABs(0) + 15) / 16, (ps.nrChannelsPerSubband() + 15) / 16); + globalWorkSize = cl::NDRange(256, (ps.nrTABs(0) + 15) / 16, ps.nrSamplesPerChannel() / 16); localWorkSize = cl::NDRange(256, 1, 1); nrOperations = 0; - nrBytesRead = (size_t) ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(SAP) * NR_POLARIZATIONS * sizeof(std::complex<float>), - //nrBytesWritten = (size_t) ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrSamplesPerChannel() * ps.nrChannelsPerSubband() * sizeof(std::complex<float>); - nrBytesWritten = (size_t) ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * sizeof(std::complex<float>); + nrBytesRead = (size_t) ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(0) * NR_POLARIZATIONS * sizeof(std::complex<float>), + //nrBytesWritten = (size_t) ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrSamplesPerChannel() * ps.nrChannelsPerSubband() * sizeof(std::complex<float>); + nrBytesWritten = (size_t) ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * sizeof(std::complex<float>); } }; @@ -871,7 +994,7 @@ class Dedispersion_FFT_Kernel void enqueue(cl::CommandQueue &queue, PerformanceCounter &counter, clFFT_Direction direction) { - size_t nrFFTs = (size_t) ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() / ps.dedispersionFFTsize(); + size_t nrFFTs = (size_t) ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() / ps.dedispersionFFTsize(); cl_int error = clFFT_ExecuteInterleaved(queue(), plan.plan, nrFFTs, direction, buffer(), buffer(), 0, 0, &event()); @@ -896,7 +1019,7 @@ class DedispersionForwardFFTkernel : public FFT_Kernel public: DedispersionForwardFFTkernel(const Parset &ps, cl::Context &context, cl::Buffer &buffer) : - FFT_Kernel(context, ps.dedispersionFFTsize(), ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() / ps.dedispersionFFTsize(), true, buffer) + FFT_Kernel(context, ps.dedispersionFFTsize(), ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() / ps.dedispersionFFTsize(), true, buffer) { ASSERT(ps.nrSamplesPerChannel() % ps.dedispersionFFTsize() == 0); } @@ -908,7 +1031,7 @@ class DedispersionBackwardFFTkernel : public FFT_Kernel public: DedispersionBackwardFFTkernel(const Parset &ps, cl::Context &context, cl::Buffer &buffer) : - FFT_Kernel(context, ps.dedispersionFFTsize(), ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() / ps.dedispersionFFTsize(), false, buffer) + FFT_Kernel(context, ps.dedispersionFFTsize(), ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() / ps.dedispersionFFTsize(), false, buffer) { ASSERT(ps.nrSamplesPerChannel() % ps.dedispersionFFTsize() == 0); } @@ -946,8 +1069,8 @@ class DedispersionChirpKernel : public Kernel //std::cout << "localWorkSize = NDRange(" << fftSize / divisor << ", 1, 1))" << std::endl; } - nrOperations = (size_t) NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * (9 * ps.nrTABs(SAP) + 17), - nrBytesRead = nrBytesWritten = sizeof(std::complex<float>) * ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel(); + nrOperations = (size_t) NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * (9 * ps.nrTABs(0) + 17), + nrBytesRead = nrBytesWritten = sizeof(std::complex<float>) * ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel(); } void enqueue(cl::CommandQueue &queue, PerformanceCounter &counter, double subbandFrequency) @@ -970,12 +1093,12 @@ class CoherentStokesKernel : public Kernel setArg(0, devStokesData); setArg(1, devComplexVoltages); - globalWorkSize = cl::NDRange(256, (ps.nrTABs(SAP) + 15) / 16, (ps.nrChannelsPerSubband() + 15) / 16); + globalWorkSize = cl::NDRange(256, (ps.nrTABs(0) + 15) / 16, (ps.nrChannelsPerSubband() + 15) / 16); localWorkSize = cl::NDRange(256, 1, 1); - nrOperations = (size_t) ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(SAP) * (ps.nrCoherentStokes() == 1 ? 8 : 20 + 2.0 / ps.coherentStokesTimeIntegrationFactor()); - nrBytesRead = (size_t) ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(SAP) * NR_POLARIZATIONS * sizeof(std::complex<float>); - nrBytesWritten = (size_t) ps.nrTABs(SAP) * ps.nrCoherentStokes() * ps.nrSamplesPerChannel() / ps.coherentStokesTimeIntegrationFactor() * ps.nrChannelsPerSubband() * sizeof(float); + nrOperations = (size_t) ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(0) * (ps.nrCoherentStokes() == 1 ? 8 : 20 + 2.0 / ps.coherentStokesTimeIntegrationFactor()); + nrBytesRead = (size_t) ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(0) * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrBytesWritten = (size_t) ps.nrTABs(0) * ps.nrCoherentStokes() * ps.nrSamplesPerChannel() / ps.coherentStokesTimeIntegrationFactor() * ps.nrChannelsPerSubband() * sizeof(float); } }; @@ -992,31 +1115,31 @@ class UHEP_BeamFormerKernel : public Kernel setArg(2, devBeamFormerWeights); #if 1 - globalWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(SAP), ps.nrSubbands()); - localWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(SAP), 1); + globalWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(0), ps.nrSubbands()); + localWorkSize = cl::NDRange(NR_POLARIZATIONS, ps.nrTABs(0), 1); size_t count = ps.nrSubbands() * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * NR_POLARIZATIONS; - size_t nrWeightsBytes = ps.nrStations() * ps.nrTABs(SAP) * ps.nrSubbands() * NR_POLARIZATIONS * sizeof(std::complex<float>); + size_t nrWeightsBytes = ps.nrStations() * ps.nrTABs(0) * ps.nrSubbands() * NR_POLARIZATIONS * sizeof(std::complex<float>); size_t nrSampleBytes = count * ps.nrStations() * ps.nrBytesPerComplexSample(); - size_t nrComplexVoltagesBytesPerPass = count * ps.nrTABs(SAP) * sizeof(std::complex<float>); + size_t nrComplexVoltagesBytesPerPass = count * ps.nrTABs(0) * sizeof(std::complex<float>); unsigned nrPasses = std::max((ps.nrStations() + 6) / 16, 1U); - nrOperations = count * ps.nrStations() * ps.nrTABs(SAP) * 8; + nrOperations = count * ps.nrStations() * ps.nrTABs(0) * 8; nrBytesRead = nrWeightsBytes + nrSampleBytes + (nrPasses - 1) * nrComplexVoltagesBytesPerPass; nrBytesWritten = nrPasses * nrComplexVoltagesBytesPerPass; #else - ASSERT(ps.nrTABs(SAP) % 3 == 0); + ASSERT(ps.nrTABs(0) % 3 == 0); ASSERT(ps.nrStations() % 6 == 0); - unsigned nrThreads = NR_POLARIZATIONS * (ps.nrTABs(SAP) / 3) * (ps.nrStations() / 6); + unsigned nrThreads = NR_POLARIZATIONS * (ps.nrTABs(0) / 3) * (ps.nrStations() / 6); globalWorkSize = cl::NDRange(nrThreads, ps.nrSubbands()); localWorkSize = cl::NDRange(nrThreads, 1); - //globalWorkSize = cl::NDRange(ps.nrStations() / 6, ps.nrTABs(SAP) / 3, ps.nrSubbands()); - //localWorkSize = cl::NDRange(ps.nrStations() / 6, ps.nrTABs(SAP) / 3, 1); + //globalWorkSize = cl::NDRange(ps.nrStations() / 6, ps.nrTABs(0) / 3, ps.nrSubbands()); + //localWorkSize = cl::NDRange(ps.nrStations() / 6, ps.nrTABs(0) / 3, 1); size_t count = ps.nrSubbands() * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * NR_POLARIZATIONS; - size_t nrWeightsBytes = ps.nrStations() * ps.nrTABs(SAP) * ps.nrSubbands() * NR_POLARIZATIONS * sizeof(std::complex<float>); + size_t nrWeightsBytes = ps.nrStations() * ps.nrTABs(0) * ps.nrSubbands() * NR_POLARIZATIONS * sizeof(std::complex<float>); size_t nrSampleBytes = count * ps.nrStations() * ps.nrBytesPerComplexSample(); - size_t nrComplexVoltagesBytes = count * ps.nrTABs(SAP) * sizeof(std::complex<float>); - nrOperations = count * ps.nrStations() * ps.nrTABs(SAP) * 8; + size_t nrComplexVoltagesBytes = count * ps.nrTABs(0) * sizeof(std::complex<float>); + nrOperations = count * ps.nrStations() * ps.nrTABs(0) * 8; nrBytesRead = nrWeightsBytes + nrSampleBytes; nrBytesWritten = nrComplexVoltagesBytes; #endif @@ -1035,12 +1158,12 @@ class UHEP_TransposeKernel : public Kernel setArg(1, devComplexVoltages); setArg(2, devReverseSubbandMapping); - globalWorkSize = cl::NDRange(256, (ps.nrTABs(SAP) + 15) / 16, 512 / 16); + globalWorkSize = cl::NDRange(256, (ps.nrTABs(0) + 15) / 16, 512 / 16); localWorkSize = cl::NDRange(256, 1, 1); nrOperations = 0; - nrBytesRead = (size_t) ps.nrSubbands() * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * ps.nrTABs(SAP) * NR_POLARIZATIONS * sizeof(std::complex<float>); - nrBytesWritten = (size_t) ps.nrTABs(SAP) * NR_POLARIZATIONS * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * 512 * sizeof(std::complex<float>); + nrBytesRead = (size_t) ps.nrSubbands() * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * ps.nrTABs(0) * NR_POLARIZATIONS * sizeof(std::complex<float>); + nrBytesWritten = (size_t) ps.nrTABs(0) * NR_POLARIZATIONS * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * 512 * sizeof(std::complex<float>); } }; @@ -1055,10 +1178,10 @@ class UHEP_InvFFT_Kernel : public Kernel setArg(0, devFFTedData); setArg(1, devFFTedData); - globalWorkSize = cl::NDRange(128, ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrSamplesPerChannel()); + globalWorkSize = cl::NDRange(128, ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrSamplesPerChannel()); localWorkSize = cl::NDRange(128, 1); - size_t nrFFTs = (size_t) ps.nrTABs(SAP) * NR_POLARIZATIONS * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1); + size_t nrFFTs = (size_t) ps.nrTABs(0) * NR_POLARIZATIONS * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1); nrOperations = nrFFTs * 5 * 1024 * 10; nrBytesRead = nrFFTs * 512 * sizeof(std::complex<float>); nrBytesWritten = nrFFTs * 1024 * sizeof(float); @@ -1083,10 +1206,10 @@ class UHEP_InvFIR_Kernel : public Kernel for (nrThreads = 1024; nrThreads > maxNrThreads; nrThreads /= 2) ; - globalWorkSize = cl::NDRange(1024, NR_POLARIZATIONS, ps.nrTABs(SAP)); + globalWorkSize = cl::NDRange(1024, NR_POLARIZATIONS, ps.nrTABs(0)); localWorkSize = cl::NDRange(nrThreads, 1, 1); - size_t count = ps.nrTABs(SAP) * NR_POLARIZATIONS * 1024; + size_t count = ps.nrTABs(0) * NR_POLARIZATIONS * 1024; nrOperations = count * ps.nrSamplesPerChannel() * NR_STATION_FILTER_TAPS * 2; nrBytesRead = count * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * sizeof(float); nrBytesWritten = count * ps.nrSamplesPerChannel() * sizeof(float); @@ -1104,12 +1227,12 @@ class UHEP_TriggerKernel : public Kernel setArg(0, devTriggerInfo); setArg(1, devInvFIRfilteredData); - globalWorkSize = cl::NDRange(16, 16, ps.nrTABs(SAP)); + globalWorkSize = cl::NDRange(16, 16, ps.nrTABs(0)); localWorkSize = cl::NDRange(16, 16, 1); - nrOperations = (size_t) ps.nrTABs(SAP) * ps.nrSamplesPerChannel() * 1024 * (3 /* power */ + 2 /* window */ + 1 /* max */ + 7 /* mean/variance */); - nrBytesRead = (size_t) ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrSamplesPerChannel() * 1024 * sizeof(float); - nrBytesWritten = (size_t) ps.nrTABs(SAP) * sizeof(TriggerInfo); + nrOperations = (size_t) ps.nrTABs(0) * ps.nrSamplesPerChannel() * 1024 * (3 /* power */ + 2 /* window */ + 1 /* max */ + 7 /* mean/variance */); + nrBytesRead = (size_t) ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrSamplesPerChannel() * 1024 * sizeof(float); + nrBytesWritten = (size_t) ps.nrTABs(0) * sizeof(TriggerInfo); } }; @@ -1143,6 +1266,8 @@ CorrelatorWorkQueue::CorrelatorWorkQueue(CorrelatorPipeline &pipeline) inputSamples(boost::extents[ps.nrStations()][(ps.nrSamplesPerChannel() + NR_TAPS - 1) * ps.nrChannelsPerSubband()][NR_POLARIZATIONS][ps.nrBytesPerComplexSample()], queue, CL_MEM_WRITE_ONLY, devBufferA), visibilities(boost::extents[ps.nrBaselines()][ps.nrChannelsPerSubband()][NR_POLARIZATIONS][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, devBufferB) { + memset(inputSamples.origin(), 0, inputSamples.bytesize()); // FIXME + memset(visibilities.origin(), 0, visibilities.bytesize()); // FIXME size_t firWeightsSize = ps.nrChannelsPerSubband() * NR_TAPS * sizeof(float); devFIRweights = cl::Buffer(pipeline.context, CL_MEM_READ_ONLY, firWeightsSize); queue.enqueueWriteBuffer(devFIRweights, CL_TRUE, 0, ps.nrChannelsPerSubband() * NR_TAPS * sizeof(float), pipeline.filterBank.getWeights().origin()); @@ -1168,7 +1293,12 @@ void CorrelatorWorkQueue::doWork() FIR_FilterKernel firFilterKernel(ps, queue, pipeline.firFilterProgram, devFilteredData, inputSamples, devFIRweights); Filter_FFT_Kernel fftKernel(ps, pipeline.context, devFilteredData); DelayAndBandPassKernel delayAndBandPassKernel(ps, pipeline.delayAndBandPassProgram, devCorrectedData, devFilteredData, delaysAtBegin, delaysAfterEnd, phaseOffsets, bandPassCorrectionWeights); +#if defined USE_NEW_CORRELATOR + CorrelateTriangleKernel correlateTriangleKernel(ps, queue, pipeline.correlatorProgram, visibilities, devCorrectedData); + CorrelateRectangleKernel correlateRectangleKernel(ps, queue, pipeline.correlatorProgram, visibilities, devCorrectedData); +#else CorrelatorKernel correlatorKernel(ps, queue, pipeline.correlatorProgram, visibilities, devCorrectedData); +#endif double startTime = ps.startTime(), currentTime, stopTime = ps.stopTime(), blockTime = ps.CNintegrationTime(); #pragma omp barrier @@ -1176,7 +1306,7 @@ void CorrelatorWorkQueue::doWork() double executionStartTime = getTime(); for (unsigned block = 0; (currentTime = startTime + block * blockTime) < stopTime; block ++) { -#pragma omp single +#pragma omp single nowait #pragma omp critical (cout) std::cout << "block = " << block << ", time = " << to_simple_string(from_ustime_t(currentTime)) << std::endl; @@ -1185,17 +1315,14 @@ void CorrelatorWorkQueue::doWork() memset(phaseOffsets.origin(), 0, phaseOffsets.bytesize()); // FIXME!!! - if (ps.nrStations() >= 3) - delaysAtBegin[0][2][0] = 1e-6, delaysAfterEnd[0][2][0] = 1.1e-6; + //if (ps.nrStations() >= 3) + //delaysAtBegin[0][2][0] = 1e-6, delaysAfterEnd[0][2][0] = 1.1e-6; delaysAtBegin.hostToDevice(CL_FALSE); delaysAfterEnd.hostToDevice(CL_FALSE); phaseOffsets.hostToDevice(CL_FALSE); - queue.finish(); -#pragma omp barrier - -#pragma omp for schedule(dynamic) +#pragma omp for schedule(dynamic), nowait for (unsigned subband = 0; subband < ps.nrSubbands(); subband ++) { try { #if defined USE_TEST_DATA @@ -1217,7 +1344,12 @@ void CorrelatorWorkQueue::doWork() } delayAndBandPassKernel.enqueue(queue, pipeline.delayAndBandPassCounter, subband); +#if defined USE_NEW_CORRELATOR + correlateTriangleKernel.enqueue(queue, pipeline.correlateTriangleCounter); + correlateRectangleKernel.enqueue(queue, pipeline.correlateRectangleCounter); +#else correlatorKernel.enqueue(queue, pipeline.correlatorCounter); +#endif queue.finish(); { @@ -1276,11 +1408,11 @@ BeamFormerWorkQueue::BeamFormerWorkQueue(BeamFormerPipeline &pipeline) delaysAfterEnd(boost::extents[ps.nrBeams()][ps.nrStations()][NR_POLARIZATIONS], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY), phaseOffsets(boost::extents[ps.nrBeams()][NR_POLARIZATIONS], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY), devCorrectedData(cl::Buffer(pipeline.context, CL_MEM_READ_WRITE, ps.nrStations() * ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * NR_POLARIZATIONS * sizeof(std::complex<float>))), - beamFormerWeights(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrTABs(SAP)], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY), - devComplexVoltages(cl::Buffer(pipeline.context, CL_MEM_READ_WRITE, ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(SAP) * NR_POLARIZATIONS * sizeof(std::complex<float>))), - //transposedComplexVoltages(boost::extents[ps.nrTABs(SAP)][NR_POLARIZATIONS][ps.nrSamplesPerChannel()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE) - transposedComplexVoltages(boost::extents[ps.nrTABs(SAP)][NR_POLARIZATIONS][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE), - DMs(boost::extents[ps.nrTABs(SAP)], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY) + beamFormerWeights(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrTABs(0)], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY), + devComplexVoltages(cl::Buffer(pipeline.context, CL_MEM_READ_WRITE, ps.nrChannelsPerSubband() * ps.nrSamplesPerChannel() * ps.nrTABs(0) * NR_POLARIZATIONS * sizeof(std::complex<float>))), + //transposedComplexVoltages(boost::extents[ps.nrTABs(0)][NR_POLARIZATIONS][ps.nrSamplesPerChannel()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE) + transposedComplexVoltages(boost::extents[ps.nrTABs(0)][NR_POLARIZATIONS][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE), + DMs(boost::extents[ps.nrTABs(0)], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY) { if (ps.correctBandPass()) { BandPass::computeCorrectionFactors(bandPassCorrectionWeights.origin(), ps.nrChannelsPerSubband()); @@ -1310,7 +1442,7 @@ void BeamFormerWorkQueue::doWork() double executionStartTime = getTime(); for (unsigned block = 0; (currentTime = startTime + block * blockTime) < stopTime; block ++) { -#pragma omp single +#pragma omp single nowait #pragma omp critical (cout) std::cout << "block = " << block << ", time = " << to_simple_string(from_ustime_t(currentTime)) << std::endl; @@ -1326,11 +1458,8 @@ void BeamFormerWorkQueue::doWork() delaysAfterEnd.hostToDevice(CL_FALSE); phaseOffsets.hostToDevice(CL_FALSE); beamFormerWeights.hostToDevice(CL_FALSE); - queue.finish(); - -#pragma omp barrier -#pragma omp for schedule(dynamic) +#pragma omp for schedule(dynamic), nowait for (unsigned subband = 0; subband < ps.nrSubbands(); subband ++) { try { #if 1 @@ -1384,13 +1513,13 @@ UHEP_WorkQueue::UHEP_WorkQueue(UHEP_Pipeline &pipeline) WorkQueue(pipeline), pipeline(pipeline), hostInputSamples(boost::extents[ps.nrStations()][ps.nrSubbands()][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][NR_POLARIZATIONS][ps.nrBytesPerComplexSample()], queue, CL_MEM_WRITE_ONLY), - hostBeamFormerWeights(boost::extents[ps.nrStations()][ps.nrSubbands()][ps.nrTABs(SAP)], queue, CL_MEM_WRITE_ONLY), - hostTriggerInfo(ps.nrTABs(SAP), queue, CL_MEM_READ_ONLY) + hostBeamFormerWeights(boost::extents[ps.nrStations()][ps.nrSubbands()][ps.nrTABs(0)], queue, CL_MEM_WRITE_ONLY), + hostTriggerInfo(ps.nrTABs(0), queue, CL_MEM_READ_ONLY) { size_t inputSamplesSize = ps.nrStations() * ps.nrSubbands() * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * NR_POLARIZATIONS * ps.nrBytesPerComplexSample(); - size_t complexVoltagesSize = ps.nrSubbands() * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * ps.nrTABs(SAP) * NR_POLARIZATIONS * sizeof(std::complex<float>); - size_t transposedDataSize = ps.nrTABs(SAP) * NR_POLARIZATIONS * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * 512 * sizeof(std::complex<float>); - size_t invFIRfilteredDataSize = ps.nrTABs(SAP) * NR_POLARIZATIONS * ps.nrSamplesPerChannel() * 512 * sizeof(std::complex<float>); + size_t complexVoltagesSize = ps.nrSubbands() * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * ps.nrTABs(0) * NR_POLARIZATIONS * sizeof(std::complex<float>); + size_t transposedDataSize = ps.nrTABs(0) * NR_POLARIZATIONS * (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) * 512 * sizeof(std::complex<float>); + size_t invFIRfilteredDataSize = ps.nrTABs(0) * NR_POLARIZATIONS * ps.nrSamplesPerChannel() * 512 * sizeof(std::complex<float>); size_t buffer0size = std::max(inputSamplesSize, transposedDataSize); size_t buffer1size = std::max(complexVoltagesSize, invFIRfilteredDataSize); @@ -1398,7 +1527,7 @@ UHEP_WorkQueue::UHEP_WorkQueue(UHEP_Pipeline &pipeline) devBuffers[0] = cl::Buffer(pipeline.context, CL_MEM_READ_WRITE, buffer0size); devBuffers[1] = cl::Buffer(pipeline.context, CL_MEM_READ_WRITE, buffer1size); - size_t beamFormerWeightsSize = ps.nrStations() * ps.nrSubbands() * ps.nrTABs(SAP) * sizeof(std::complex<float>); + size_t beamFormerWeightsSize = ps.nrStations() * ps.nrSubbands() * ps.nrTABs(0) * sizeof(std::complex<float>); devBeamFormerWeights = cl::Buffer(pipeline.context, CL_MEM_READ_ONLY, beamFormerWeightsSize); devInputSamples = devBuffers[0]; @@ -1409,7 +1538,7 @@ UHEP_WorkQueue::UHEP_WorkQueue(UHEP_Pipeline &pipeline) devFFTedData = devBuffers[0]; devInvFIRfilteredData = devBuffers[1]; - devTriggerInfo = cl::Buffer(pipeline.context, CL_MEM_WRITE_ONLY, ps.nrTABs(SAP) * sizeof(TriggerInfo)); + devTriggerInfo = cl::Buffer(pipeline.context, CL_MEM_WRITE_ONLY, ps.nrTABs(0) * sizeof(TriggerInfo)); } @@ -1430,12 +1559,12 @@ void UHEP_WorkQueue::doWork(const float * /*delaysAtBegin*/, const float * /*del double executionStartTime = getTime(); -#pragma omp for schedule(dynamic) +#pragma omp for schedule(dynamic), nowait for (unsigned block = 0; block < nrBlocks; block ++) { try { double currentTime = startTime + block * blockTime; -//#pragma omp single // FIXME: why does the compiler complain here??? +//#pragma omp single nowait // FIXME: why does the compiler complain here??? #pragma omp critical (cout) std::cout << "block = " << block << ", time = " << to_simple_string(from_ustime_t(currentTime)) << std::endl; @@ -1607,18 +1736,21 @@ struct CorrelatorTest : public UnitTest { CorrelatorTest(const Parset &ps) : - //UnitTest(ps, "Correlator.cl") +#if defined USE_NEW_CORRELATOR UnitTest(ps, "NewCorrelator.cl") +#else + UnitTest(ps, "Correlator.cl") +#endif { if (ps.nrStations() >= 5 && ps.nrChannelsPerSubband() >= 6 && ps.nrSamplesPerChannel() >= 100) { - MultiArraySharedBuffer<std::complex<float>, 4> inputData(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][NR_POLARIZATIONS], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); MultiArraySharedBuffer<std::complex<float>, 4> visibilities(boost::extents[ps.nrBaselines()][ps.nrChannelsPerSubband()][NR_POLARIZATIONS][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> inputData(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][NR_POLARIZATIONS], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); CorrelatorKernel correlator(ps, queue, program, visibilities, inputData); //inputData[3][5][99][1] = std::complex<float>(3, 4); //inputData[4][5][99][1] = std::complex<float>(5, 6); - inputData[2][5][99][1] = std::complex<float>(3, 4); - inputData[65][5][99][1] = std::complex<float>(5, 6); + inputData[0][5][99][1] = std::complex<float>(3, 4); + inputData[2][5][99][1] = std::complex<float>(5, 6); visibilities.hostToDevice(CL_FALSE); inputData.hostToDevice(CL_FALSE); @@ -1635,6 +1767,70 @@ visibilities.hostToDevice(CL_FALSE); }; +#if defined USE_NEW_CORRELATOR + +struct CorrelateRectangleTest : public UnitTest +{ + CorrelateRectangleTest(const Parset &ps) + : + //UnitTest(ps, "Correlator.cl") + UnitTest(ps, "NewCorrelator.cl") + { + if (ps.nrStations() >= 5 && ps.nrChannelsPerSubband() >= 6 && ps.nrSamplesPerChannel() >= 100) { + MultiArraySharedBuffer<std::complex<float>, 4> visibilities(boost::extents[ps.nrBaselines()][ps.nrChannelsPerSubband()][NR_POLARIZATIONS][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> inputData(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][NR_POLARIZATIONS], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); + CorrelateRectangleKernel correlator(ps, queue, program, visibilities, inputData); + + inputData[27][5][99][1] = std::complex<float>(3, 4); + inputData[68][5][99][1] = std::complex<float>(5, 6); + +visibilities.hostToDevice(CL_FALSE); + inputData.hostToDevice(CL_FALSE); + correlator.enqueue(queue, counter); + visibilities.deviceToHost(CL_TRUE); + + //check(visibilities[5463][5][1][1], std::complex<float>(39, 2)); + for (unsigned bl = 0; bl < ps.nrBaselines(); bl ++) + if (visibilities[bl][5][1][1] != std::complex<float>(0, 0)) + std::cout << "bl = " << bl << ", visibility = " << visibilities[bl][5][1][1] << std::endl; + } + } +}; + + +struct CorrelateTriangleTest : public UnitTest +{ + CorrelateTriangleTest(const Parset &ps) + : + //UnitTest(ps, "Correlator.cl") + UnitTest(ps, "NewCorrelator.cl") + { + if (ps.nrStations() >= 5 && ps.nrChannelsPerSubband() >= 6 && ps.nrSamplesPerChannel() >= 100) { + MultiArraySharedBuffer<std::complex<float>, 4> visibilities(boost::extents[ps.nrBaselines()][ps.nrChannelsPerSubband()][NR_POLARIZATIONS][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> inputData(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][NR_POLARIZATIONS], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); + CorrelateTriangleKernel correlator(ps, queue, program, visibilities, inputData); + + //inputData[3][5][99][1] = std::complex<float>(3, 4); + //inputData[4][5][99][1] = std::complex<float>(5, 6); + inputData[0][5][99][1] = std::complex<float>(3, 4); + inputData[2][5][99][1] = std::complex<float>(5, 6); + +visibilities.hostToDevice(CL_FALSE); + inputData.hostToDevice(CL_FALSE); + correlator.enqueue(queue, counter); + visibilities.deviceToHost(CL_TRUE); + + //check(visibilities[13][5][1][1], std::complex<float>(39, 2)); + for (unsigned bl = 0; bl < ps.nrBaselines(); bl ++) + if (visibilities[bl][5][1][1] != std::complex<float>(0, 0)) + std::cout << "bl = " << bl << ", visibility = " << visibilities[bl][5][1][1] << std::endl; + } + } +}; + +#endif + + struct IncoherentStokesTest : public UnitTest { IncoherentStokesTest(const Parset &ps) @@ -1699,10 +1895,10 @@ struct BeamFormerTest : public UnitTest : UnitTest(ps, "BeamFormer/BeamFormer.cl") { - if (ps.nrStations() >= 5 && ps.nrSamplesPerChannel() >= 13 && ps.nrChannelsPerSubband() >= 7 && ps.nrTABs(SAP) >= 6) { + if (ps.nrStations() >= 5 && ps.nrSamplesPerChannel() >= 13 && ps.nrChannelsPerSubband() >= 7 && ps.nrTABs(0) >= 6) { MultiArraySharedBuffer<std::complex<float>, 4> inputData(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][NR_POLARIZATIONS], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); - MultiArraySharedBuffer<std::complex<float>, 3> beamFormerWeights(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrTABs(SAP)], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); - MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][ps.nrTABs(SAP)][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE); + MultiArraySharedBuffer<std::complex<float>, 3> beamFormerWeights(boost::extents[ps.nrStations()][ps.nrChannelsPerSubband()][ps.nrTABs(0)], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][ps.nrTABs(0)][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE); BeamFormerKernel beamFormer(ps, program, complexVoltages, inputData, beamFormerWeights); inputData[4][6][12][1] = std::complex<float>(2.2, 3); @@ -1716,7 +1912,7 @@ struct BeamFormerTest : public UnitTest check(complexVoltages[6][12][5][1], std::complex<float>(-6.2, 23)); #if 0 - for (unsigned tab = 0; tab < ps.nrTABs(SAP); tab ++) + for (unsigned tab = 0; tab < ps.nrTABs(0); tab ++) for (unsigned pol = 0; pol < NR_POLARIZATIONS; pol ++) for (unsigned ch = 0; ch < ps.nrChannelsPerSubband(); ch ++) for (unsigned t = 0; t < ps.nrSamplesPerChannel(); t ++) @@ -1734,9 +1930,9 @@ struct BeamFormerTransposeTest : public UnitTest : UnitTest(ps, "BeamFormer/Transpose.cl") { - if (ps.nrChannelsPerSubband() >= 19 && ps.nrSamplesPerChannel() >= 175 && ps.nrTABs(SAP) >= 5) { - MultiArraySharedBuffer<std::complex<float>, 4> transposedData(boost::extents[ps.nrTABs(SAP)][NR_POLARIZATIONS][ps.nrSamplesPerChannel()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); - MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][ps.nrTABs(SAP)][NR_POLARIZATIONS], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); + if (ps.nrChannelsPerSubband() >= 19 && ps.nrSamplesPerChannel() >= 175 && ps.nrTABs(0) >= 5) { + MultiArraySharedBuffer<std::complex<float>, 4> transposedData(boost::extents[ps.nrTABs(0)][NR_POLARIZATIONS][ps.nrSamplesPerChannel()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][ps.nrTABs(0)][NR_POLARIZATIONS], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); BeamFormerTransposeKernel transpose(ps, program, transposedData, complexVoltages); complexVoltages[18][174][4][1] = std::complex<float>(24, 42); @@ -1757,9 +1953,9 @@ struct DedispersionChirpTest : public UnitTest : UnitTest(ps, "BeamFormer/Dedispersion.cl") { - if (ps.nrTABs(SAP) > 3 && ps.nrChannelsPerSubband() > 13 && ps.nrSamplesPerChannel() / ps.dedispersionFFTsize() > 1 && ps.dedispersionFFTsize() > 77) { - MultiArraySharedBuffer<std::complex<float>, 5> data(boost::extents[ps.nrTABs(SAP)][NR_POLARIZATIONS][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel() / ps.dedispersionFFTsize()][ps.dedispersionFFTsize()], queue, CL_MEM_READ_WRITE, CL_MEM_READ_WRITE); - MultiArraySharedBuffer<float, 1> DMs(boost::extents[ps.nrTABs(SAP)], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + if (ps.nrTABs(0) > 3 && ps.nrChannelsPerSubband() > 13 && ps.nrSamplesPerChannel() / ps.dedispersionFFTsize() > 1 && ps.dedispersionFFTsize() > 77) { + MultiArraySharedBuffer<std::complex<float>, 5> data(boost::extents[ps.nrTABs(0)][NR_POLARIZATIONS][ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel() / ps.dedispersionFFTsize()][ps.dedispersionFFTsize()], queue, CL_MEM_READ_WRITE, CL_MEM_READ_WRITE); + MultiArraySharedBuffer<float, 1> DMs(boost::extents[ps.nrTABs(0)], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); DedispersionChirpKernel dedispersionChirpKernel(ps, program, queue, data, DMs); data[3][1][13][1][77] = std::complex<float>(2, 3); @@ -1782,16 +1978,16 @@ struct CoherentStokesTest : public UnitTest : UnitTest(ps, "BeamFormer/CoherentStokes.cl") { - if (ps.nrChannelsPerSubband() >= 19 && ps.nrSamplesPerChannel() >= 175 && ps.nrTABs(SAP) >= 5) { - MultiArraySharedBuffer<float, 4> stokesData(boost::extents[ps.nrTABs(SAP)][ps.nrCoherentStokes()][ps.nrSamplesPerChannel() / ps.coherentStokesTimeIntegrationFactor()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + if (ps.nrChannelsPerSubband() >= 19 && ps.nrSamplesPerChannel() >= 175 && ps.nrTABs(0) >= 5) { + MultiArraySharedBuffer<float, 4> stokesData(boost::extents[ps.nrTABs(0)][ps.nrCoherentStokes()][ps.nrSamplesPerChannel() / ps.coherentStokesTimeIntegrationFactor()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); #if 1 - MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][ps.nrTABs(SAP)][NR_POLARIZATIONS], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrChannelsPerSubband()][ps.nrSamplesPerChannel()][ps.nrTABs(0)][NR_POLARIZATIONS], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); CoherentStokesKernel stokesKernel(ps, program, stokesData, complexVoltages); complexVoltages[18][174][4][0] = std::complex<float>(2, 3); complexVoltages[18][174][4][1] = std::complex<float>(4, 5); #else - MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrTABs(SAP)][NR_POLARIZATIONS][ps.nrSamplesPerChannel()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrTABs(0)][NR_POLARIZATIONS][ps.nrSamplesPerChannel()][ps.nrChannelsPerSubband()], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); CoherentStokesKernel stokesKernel(ps, program, stokesData, complexVoltages); complexVoltages[18][174][4][0] = std::complex<float>(2, 3); @@ -1815,10 +2011,10 @@ struct UHEP_BeamFormerTest : public UnitTest : UnitTest(ps, "UHEP/BeamFormer.cl") { - if (ps.nrStations() >= 5 && (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) >= 13 && ps.nrSubbands() >= 7 && ps.nrTABs(SAP) >= 6) { + if (ps.nrStations() >= 5 && (ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1) >= 13 && ps.nrSubbands() >= 7 && ps.nrTABs(0) >= 6) { MultiArraySharedBuffer<char, 5> inputSamples(boost::extents[ps.nrStations()][ps.nrSubbands()][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][NR_POLARIZATIONS][ps.nrBytesPerComplexSample()], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); - MultiArraySharedBuffer<std::complex<float>, 3> beamFormerWeights(boost::extents[ps.nrStations()][ps.nrSubbands()][ps.nrTABs(SAP)], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); - MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrSubbands()][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][ps.nrTABs(SAP)][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE); + MultiArraySharedBuffer<std::complex<float>, 3> beamFormerWeights(boost::extents[ps.nrStations()][ps.nrSubbands()][ps.nrTABs(0)], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrSubbands()][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][ps.nrTABs(0)][NR_POLARIZATIONS], queue, CL_MEM_READ_ONLY, CL_MEM_READ_WRITE); UHEP_BeamFormerKernel beamFormer(ps, program, complexVoltages, inputSamples, beamFormerWeights); switch (ps.nrBytesPerComplexSample()) { @@ -1851,9 +2047,9 @@ struct UHEP_TransposeTest : public UnitTest : UnitTest(ps, "UHEP/Transpose.cl") { - if (ps.nrSubbands() >= 19 && ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1 >= 175 && ps.nrTABs(SAP) >= 5) { - MultiArraySharedBuffer<std::complex<float>, 4> transposedData(boost::extents[ps.nrTABs(SAP)][NR_POLARIZATIONS][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][512], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); - MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrSubbands()][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][ps.nrTABs(SAP)][NR_POLARIZATIONS], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); + if (ps.nrSubbands() >= 19 && ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1 >= 175 && ps.nrTABs(0) >= 5) { + MultiArraySharedBuffer<std::complex<float>, 4> transposedData(boost::extents[ps.nrTABs(0)][NR_POLARIZATIONS][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][512], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + MultiArraySharedBuffer<std::complex<float>, 4> complexVoltages(boost::extents[ps.nrSubbands()][ps.nrSamplesPerChannel() + NR_STATION_FILTER_TAPS - 1][ps.nrTABs(0)][NR_POLARIZATIONS], queue, CL_MEM_READ_WRITE, CL_MEM_READ_ONLY); cl::Buffer devReverseSubbandMapping(context, CL_MEM_READ_ONLY, 512 * sizeof(int)); UHEP_TransposeKernel transpose(ps, program, transposedData, complexVoltages, devReverseSubbandMapping); @@ -1876,9 +2072,9 @@ struct UHEP_TriggerTest : public UnitTest : UnitTest(ps, "UHEP/Trigger.cl") { - if (ps.nrTABs(SAP) >= 4 && 1024 * ps.nrSamplesPerChannel() > 100015) { - MultiArraySharedBuffer<float, 3> inputData(boost::extents[ps.nrTABs(SAP)][NR_POLARIZATIONS][ps.nrSamplesPerChannel() * 1024], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); - MultiArraySharedBuffer<TriggerInfo, 1> triggerInfo(boost::extents[ps.nrTABs(SAP)], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); + if (ps.nrTABs(0) >= 4 && 1024 * ps.nrSamplesPerChannel() > 100015) { + MultiArraySharedBuffer<float, 3> inputData(boost::extents[ps.nrTABs(0)][NR_POLARIZATIONS][ps.nrSamplesPerChannel() * 1024], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); + MultiArraySharedBuffer<TriggerInfo, 1> triggerInfo(boost::extents[ps.nrTABs(0)], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); UHEP_TriggerKernel trigger(ps, program, triggerInfo, inputData); inputData[3][1][100015] = 1000; @@ -1900,7 +2096,7 @@ struct UHEP_TriggerTest : public UnitTest struct FFT_Test : public UnitTest { FFT_Test(const Parset &ps) - : UnitTest(ps, "fft2.cl") + : UnitTest(ps, "fft.cl") { MultiArraySharedBuffer<std::complex<float>, 1> in(boost::extents[8], queue, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY); MultiArraySharedBuffer<std::complex<float>, 1> out(boost::extents[8], queue, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY); @@ -1979,34 +2175,14 @@ int main(int argc, char **argv) const char *str = getenv("NR_GPUS"); nrGPUs = str ? atoi(str) : 1; -#if 0 - ps.nrSubbands() = 10;//488; - ps.nrChannelsPerSubband() = 64; - ps.nrBeams() = 1; - ps.nrSamplesPerChannel() = 196608 / ps.nrChannelsPerSubband(); - ps.subbandBandwidth() = 195312.5; - ps.correctBandPass() = true; -#endif + profiling = false; CorrelatorPipeline(ps).doWork(); + profiling = true; CorrelatorPipeline(ps).doWork(); - //profiling = false; CorrelatorPipeline(ps).doWork(); - //profiling = true; CorrelatorPipeline(ps).doWork(); - - (CorrelatorTest)(ps); + //(CorrelatorTest)(ps); + //(CorrelateRectangleTest)(ps); + //(CorrelateTriangleTest)(ps); #if 0 - ps.nrSubbands() = 488; - ps.nrChannelsPerSubband() = 2048; - ps.nrBeams() = 1; - ps.nrTABs(SAP) = 128; - ps.nrIncoherentStokes() = 4; - ps.nrCoherentStokes() = 4; - ps.incoherentStokesTimeIntegrationFactor() = 8; - ps.coherentStokesTimeIntegrationFactor() = 8; - ps.nrSamplesPerChannel() = 65536 / ps.nrChannelsPerSubband();//262144 / ps.nrChannelsPerSubband(); - ps.subbandBandwidth() = 195312.5; - ps.correctBandPass() = true; - ps.dedispersionFFTsize() = ps.nrSamplesPerChannel(); - profiling = false; BeamFormerPipeline(ps).doWork(); profiling = true; BeamFormerPipeline(ps).doWork(); //(IncoherentStokesTest)(ps); @@ -2018,12 +2194,6 @@ int main(int argc, char **argv) #endif #if 0 - ps.nrSubbands() = 488; - ps.nrSamplesPerChannel() = 1024; - ps.nrBeams() = 1; - ps.subbandBandwidth() = 195312.5; - ps.nrTABs(SAP) = 48; - profiling = false; UHEP_Pipeline(ps).doWork(); profiling = true; UHEP_Pipeline(ps).doWork(); //(UHEP_BeamFormerTest)(ps); diff --git a/RTCP/GPUProc/src/UHEP/BeamFormer.cl-0.ptx b/RTCP/GPUProc/src/UHEP/BeamFormer.cl-0.ptx deleted file mode 100644 index ea220810bb7..00000000000 --- a/RTCP/GPUProc/src/UHEP/BeamFormer.cl-0.ptx +++ /dev/null @@ -1,207 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Tue Feb 7 07:15:59 2012 (1328595359) -// Driver 295.20 -// - -.version 3.0 -.target sm_21, texmode_independent -.address_size 32 - -.extern .shared .align 16 .b8 shr_2__local[2048]; - -.entry complexVoltages( - .param .u32 .ptr .global .align 1 complexVoltages_param_0, - .param .u32 .ptr .global .align 1 complexVoltages_param_1, - .param .u32 .ptr .global .align 1 complexVoltages_param_2 -) -{ - .reg .f32 %f<173>; - .reg .pred %p<7>; - .reg .s32 %r<76>; - .reg .s16 %rc<16>; - - - ld.param.u32 %r29, [complexVoltages_param_2]; - // inline asm - mov.u32 %r22, %tid.x; - // inline asm - // inline asm - mov.u32 %r23, %tid.y; - // inline asm - // inline asm - mov.u32 %r24, %envreg5; - // inline asm - // inline asm - mov.u32 %r25, %ntid.z; - // inline asm - // inline asm - mov.u32 %r26, %ctaid.z; - // inline asm - // inline asm - mov.u32 %r27, %tid.z; - // inline asm - add.s32 %r30, %r27, %r24; - mad.lo.s32 %r4, %r26, %r25, %r30; - shl.b32 %r31, %r23, 4; - mad.lo.s32 %r32, %r4, 66496, %r31; - shl.b32 %r33, %r22, 3; - add.s32 %r5, %r32, %r33; - shl.b32 %r34, %r4, 5; - shl.b32 %r35, %r23, 3; - add.s32 %r36, %r34, %r35; - add.s32 %r37, %r29, %r36; - ld.global.v2.f32 {%f131, %f132}, [%r37]; - ld.global.v2.f32 {%f137, %f138}, [%r37+15616]; - ld.global.v2.f32 {%f143, %f144}, [%r37+31232]; - ld.global.v2.f32 {%f149, %f150}, [%r37+46848]; - ld.global.v2.f32 {%f155, %f156}, [%r37+62464]; - ld.global.v2.f32 {%f161, %f162}, [%r37+78080]; - ld.global.v2.f32 {%f167, %f168}, [%r37+93696]; - mov.u32 %r72, 0; - -BB0_1: - shl.b32 %r40, %r72, 10; - add.s32 %r7, %r5, %r40; - // inline asm - mov.u32 %r38, %tid.x; - // inline asm - // inline asm - mov.u32 %r39, %tid.y; - // inline asm - shl.b32 %r9, %r39, 1; - add.s32 %r74, %r9, %r38; - setp.gt.u32 %p1, %r74, 127; - @%p1 bra BB0_6; - - add.s32 %r11, %r38, %r9; - cvt.u8.u32 %rc1, %r11; - mov.u16 %rc15, 0; - mov.u32 %r73, 0; - -BB0_3: - add.s32 %r14, %r11, %r73; - shl.b32 %r42, %r72, 4; - shl.b16 %rc5, %rc15, 3; - add.s16 %rc6, %rc1, %rc5; - cvt.u32.u8 %r43, %rc6; - and.b32 %r44, %r43, 15; - add.s32 %r15, %r42, %r44; - setp.gt.u32 %p2, %r15, 1038; - @%p2 bra BB0_5; - - shr.u32 %r45, %r14, 4; - ld.param.u32 %r71, [complexVoltages_param_1]; - mad.lo.s32 %r46, %r45, 2028128, %r71; - mad.lo.s32 %r47, %r4, 4156, %r46; - shl.b32 %r48, %r15, 2; - add.s32 %r49, %r47, %r48; - ld.global.v4.u8 {%rc11, %rc12, %rc13, %rc14}, [%r49]; - // inline asm - cvt.rn.f32.s8 %f1, %rc11; - // inline asm - // inline asm - cvt.rn.f32.s8 %f2, %rc12; - // inline asm - // inline asm - cvt.rn.f32.s8 %f3, %rc13; - // inline asm - // inline asm - cvt.rn.f32.s8 %f4, %rc14; - // inline asm - shl.b32 %r50, %r74, 4; - mov.u32 %r51, shr_2__local; - add.s32 %r52, %r51, %r50; - st.shared.v4.f32 [%r52], {%f1, %f2, %f3, %f4}; - -BB0_5: - add.s32 %r74, %r74, 8; - setp.lt.u32 %p3, %r74, 128; - add.s32 %r73, %r73, 8; - add.s16 %rc15, %rc15, 1; - @%p3 bra BB0_3; - -BB0_6: - bar.sync 0; - mov.u32 %r56, 1039; - shl.b32 %r57, %r72, 4; - sub.s32 %r18, %r56, %r57; - mov.u32 %r54, 16; - // inline asm - min.u32 %r53, %r54, %r18; - // inline asm - setp.eq.s32 %p4, %r53, 0; - @%p4 bra BB0_9; - - mov.u32 %r75, 0; - -BB0_8: - shl.b32 %r62, %r75, 6; - add.s32 %r63, %r7, %r62; - ld.param.u32 %r70, [complexVoltages_param_0]; - add.s32 %r64, %r70, %r63; - shl.b32 %r65, %r75, 4; - mov.u32 %r66, shr_2__local; - add.s32 %r67, %r66, %r65; - add.s32 %r69, %r67, %r33; - ld.shared.v2.f32 {%f27, %f28}, [%r69]; - mov.f32 %f5, 0f00000000; - fma.rn.ftz.f32 %f31, %f131, %f27, %f5; - fma.rn.ftz.f32 %f32, %f131, %f28, %f5; - neg.ftz.f32 %f7, %f28; - fma.rn.ftz.f32 %f39, %f132, %f7, %f31; - fma.rn.ftz.f32 %f40, %f132, %f27, %f32; - ld.shared.v2.f32 {%f43, %f44}, [%r69+256]; - fma.rn.ftz.f32 %f45, %f137, %f43, %f39; - fma.rn.ftz.f32 %f46, %f137, %f44, %f40; - neg.ftz.f32 %f10, %f44; - fma.rn.ftz.f32 %f53, %f138, %f10, %f45; - fma.rn.ftz.f32 %f54, %f138, %f43, %f46; - ld.shared.v2.f32 {%f57, %f58}, [%r69+512]; - fma.rn.ftz.f32 %f59, %f143, %f57, %f53; - fma.rn.ftz.f32 %f60, %f143, %f58, %f54; - neg.ftz.f32 %f13, %f58; - fma.rn.ftz.f32 %f67, %f144, %f13, %f59; - fma.rn.ftz.f32 %f68, %f144, %f57, %f60; - ld.shared.v2.f32 {%f71, %f72}, [%r69+768]; - fma.rn.ftz.f32 %f73, %f149, %f71, %f67; - fma.rn.ftz.f32 %f74, %f149, %f72, %f68; - neg.ftz.f32 %f16, %f72; - fma.rn.ftz.f32 %f81, %f150, %f16, %f73; - fma.rn.ftz.f32 %f82, %f150, %f71, %f74; - ld.shared.v2.f32 {%f85, %f86}, [%r69+1024]; - fma.rn.ftz.f32 %f87, %f155, %f85, %f81; - fma.rn.ftz.f32 %f88, %f155, %f86, %f82; - neg.ftz.f32 %f19, %f86; - fma.rn.ftz.f32 %f95, %f156, %f19, %f87; - fma.rn.ftz.f32 %f96, %f156, %f85, %f88; - ld.shared.v2.f32 {%f99, %f100}, [%r69+1280]; - fma.rn.ftz.f32 %f101, %f161, %f99, %f95; - fma.rn.ftz.f32 %f102, %f161, %f100, %f96; - neg.ftz.f32 %f22, %f100; - fma.rn.ftz.f32 %f109, %f162, %f22, %f101; - fma.rn.ftz.f32 %f110, %f162, %f99, %f102; - ld.shared.v2.f32 {%f113, %f114}, [%r69+1536]; - fma.rn.ftz.f32 %f115, %f167, %f113, %f109; - fma.rn.ftz.f32 %f116, %f167, %f114, %f110; - neg.ftz.f32 %f25, %f114; - fma.rn.ftz.f32 %f123, %f168, %f25, %f115; - fma.rn.ftz.f32 %f124, %f168, %f113, %f116; - st.global.v2.f32 [%r64], {%f123, %f124}; - // inline asm - min.u32 %r59, %r54, %r18; - // inline asm - add.s32 %r75, %r75, 1; - setp.lt.u32 %p5, %r75, %r59; - @%p5 bra BB0_8; - -BB0_9: - bar.sync 0; - add.s32 %r72, %r72, 1; - setp.ne.s32 %p6, %r72, 65; - @%p6 bra BB0_1; - - ret; -} - - diff --git a/RTCP/GPUProc/src/UHEP/BeamFormer.cl.hop-0.ptx b/RTCP/GPUProc/src/UHEP/BeamFormer.cl.hop-0.ptx deleted file mode 100644 index 79498463a835875a85828f52fd7f756eb2b37aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53640 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%0DNn)VJiaDxGRu9DC5MqK3_aoT`ihZH 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 NVgD-m8lPO>{{x#lgRlSq diff --git a/RTCP/GPUProc/src/UHEP/InvFFT.cl-0.ptx b/RTCP/GPUProc/src/UHEP/InvFFT.cl-0.ptx deleted file mode 100644 index 86d5c2b0918..00000000000 --- a/RTCP/GPUProc/src/UHEP/InvFFT.cl-0.ptx +++ /dev/null @@ -1,759 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Tue Feb 7 07:15:59 2012 (1328595359) -// Driver 295.20 -// - -.version 3.0 -.target sm_21, texmode_independent -.address_size 32 - -.extern .shared .align 32 .b8 shr_3_lds[4096]; - -.entry inv_fft( - .param .u32 .ptr .global .align 8 inv_fft_param_0, - .param .u32 .ptr .global .align 4 inv_fft_param_1 -) -.reqntid 128, 1, 1 -{ - .reg .f32 %f<576>; - .reg .pred %p<2>; - .reg .s32 %r<212>; - - - ld.param.u32 %r26, [inv_fft_param_1]; - // inline asm - mov.u32 %r2, %tid.x; - // inline asm - // inline asm - mov.u32 %r3, %envreg4; - // inline asm - // inline asm - mov.u32 %r4, %ntid.y; - // inline asm - // inline asm - mov.u32 %r5, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r6, %tid.y; - // inline asm - add.s32 %r27, %r6, %r3; - mad.lo.s32 %r28, %r5, %r4, %r27; - shl.b32 %r29, %r28, 12; - add.s32 %r30, %r26, %r29; - shl.b32 %r31, %r2, 3; - add.s32 %r32, %r30, %r31; - ld.global.v2.f32 {%f574, %f575}, [%r32]; - // inline asm - mov.u32 %r7, %tid.x; - // inline asm - // inline asm - mov.u32 %r8, %envreg4; - // inline asm - // inline asm - mov.u32 %r9, %ntid.y; - // inline asm - // inline asm - mov.u32 %r10, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r11, %tid.y; - // inline asm - add.s32 %r33, %r11, %r8; - mad.lo.s32 %r34, %r10, %r9, %r33; - shl.b32 %r35, %r34, 12; - add.s32 %r36, %r26, %r35; - shl.b32 %r37, %r7, 3; - add.s32 %r38, %r37, %r36; - ld.global.v2.f32 {%f516, %f517}, [%r38+1024]; - // inline asm - mov.u32 %r12, %tid.x; - // inline asm - // inline asm - mov.u32 %r13, %envreg4; - // inline asm - // inline asm - mov.u32 %r14, %ntid.y; - // inline asm - // inline asm - mov.u32 %r15, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r16, %tid.y; - // inline asm - add.s32 %r39, %r16, %r13; - mad.lo.s32 %r40, %r15, %r14, %r39; - shl.b32 %r41, %r40, 12; - add.s32 %r42, %r26, %r41; - shl.b32 %r43, %r12, 3; - add.s32 %r44, %r43, %r42; - ld.global.v2.f32 {%f510, %f511}, [%r44+2048]; - // inline asm - mov.u32 %r17, %tid.x; - // inline asm - // inline asm - mov.u32 %r18, %envreg4; - // inline asm - // inline asm - mov.u32 %r19, %ntid.y; - // inline asm - // inline asm - mov.u32 %r20, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r21, %tid.y; - // inline asm - add.s32 %r45, %r21, %r18; - mad.lo.s32 %r46, %r20, %r19, %r45; - shl.b32 %r47, %r46, 12; - add.s32 %r48, %r26, %r47; - shl.b32 %r49, %r17, 3; - add.s32 %r50, %r49, %r48; - ld.global.v2.f32 {%f522, %f523}, [%r50+3072]; - // inline asm - mov.u32 %r22, %tid.x; - // inline asm - shl.b32 %r51, %r22, 3; - mov.u32 %r52, shr_3_lds; - add.s32 %r53, %r52, %r51; - st.shared.v2.f32 [%r53], {%f574, %f575}; - // inline asm - mov.u32 %r23, %tid.x; - // inline asm - shl.b32 %r54, %r23, 3; - add.s32 %r55, %r54, %r52; - st.shared.v2.f32 [%r55+1024], {%f516, %f517}; - // inline asm - mov.u32 %r24, %tid.x; - // inline asm - shl.b32 %r56, %r24, 3; - add.s32 %r57, %r56, %r52; - st.shared.v2.f32 [%r57+2048], {%f510, %f511}; - // inline asm - mov.u32 %r25, %tid.x; - // inline asm - shl.b32 %r58, %r25, 3; - add.s32 %r59, %r58, %r52; - st.shared.v2.f32 [%r59+3072], {%f522, %f523}; - bar.sync 0; - // inline asm - mov.u32 %r60, %tid.x; - // inline asm - setp.eq.s32 %p1, %r60, 0; - @%p1 bra BB0_2; - - // inline asm - mov.u32 %r61, %tid.x; - // inline asm - mov.u32 %r62, 512; - sub.s32 %r63, %r62, %r61; - shl.b32 %r64, %r63, 3; - add.s32 %r66, %r52, %r64; - ld.shared.v2.f32 {%f572, %f573}, [%r66]; - bra.uni BB0_3; - -BB0_2: - mov.f32 %f17, 0f00000000; - mov.f32 %f572, %f575; - mov.f32 %f573, %f17; - mov.f32 %f574, %f574; - mov.f32 %f575, %f17; - -BB0_3: - // inline asm - mov.u32 %r67, %tid.x; - // inline asm - mov.u32 %r70, 384; - sub.s32 %r71, %r70, %r67; - shl.b32 %r72, %r71, 3; - add.s32 %r74, %r52, %r72; - ld.shared.v2.f32 {%f490, %f491}, [%r74]; - // inline asm - mov.u32 %r68, %tid.x; - // inline asm - mov.u32 %r75, 256; - sub.s32 %r76, %r75, %r68; - shl.b32 %r77, %r76, 3; - add.s32 %r78, %r52, %r77; - ld.shared.v2.f32 {%f492, %f493}, [%r78]; - // inline asm - mov.u32 %r69, %tid.x; - // inline asm - mov.u32 %r79, 128; - sub.s32 %r80, %r79, %r69; - shl.b32 %r81, %r80, 3; - add.s32 %r82, %r52, %r81; - neg.ftz.f32 %f20, %f573; - neg.ftz.f32 %f22, %f491; - neg.ftz.f32 %f24, %f493; - ld.shared.v2.f32 {%f500, %f501}, [%r82]; - neg.ftz.f32 %f26, %f501; - add.ftz.f32 %f504, %f574, %f572; - add.ftz.f32 %f505, %f575, %f20; - sub.ftz.f32 %f506, %f574, %f572; - sub.ftz.f32 %f507, %f575, %f20; - add.ftz.f32 %f508, %f510, %f492; - add.ftz.f32 %f509, %f511, %f24; - sub.ftz.f32 %f512, %f510, %f492; - sub.ftz.f32 %f513, %f511, %f24; - add.ftz.f32 %f514, %f516, %f490; - add.ftz.f32 %f515, %f517, %f22; - sub.ftz.f32 %f518, %f516, %f490; - sub.ftz.f32 %f519, %f517, %f22; - add.ftz.f32 %f520, %f522, %f500; - add.ftz.f32 %f521, %f523, %f26; - sub.ftz.f32 %f524, %f522, %f500; - sub.ftz.f32 %f525, %f523, %f26; - add.ftz.f32 %f526, %f504, %f508; - add.ftz.f32 %f527, %f505, %f509; - sub.ftz.f32 %f528, %f504, %f508; - sub.ftz.f32 %f529, %f505, %f509; - neg.ftz.f32 %f28, %f513; - add.ftz.f32 %f534, %f506, %f28; - add.ftz.f32 %f535, %f507, %f512; - sub.ftz.f32 %f536, %f506, %f28; - sub.ftz.f32 %f537, %f507, %f512; - add.ftz.f32 %f538, %f514, %f520; - add.ftz.f32 %f539, %f515, %f521; - sub.ftz.f32 %f540, %f514, %f520; - sub.ftz.f32 %f541, %f515, %f521; - neg.ftz.f32 %f31, %f525; - add.ftz.f32 %f546, %f518, %f31; - add.ftz.f32 %f547, %f519, %f524; - sub.ftz.f32 %f548, %f518, %f31; - sub.ftz.f32 %f549, %f519, %f524; - add.ftz.f32 %f446, %f526, %f538; - add.ftz.f32 %f447, %f527, %f539; - sub.ftz.f32 %f454, %f526, %f538; - sub.ftz.f32 %f455, %f527, %f539; - neg.ftz.f32 %f34, %f547; - add.ftz.f32 %f554, %f34, %f546; - add.ftz.f32 %f555, %f546, %f547; - mov.f32 %f36, 0f3F3504F3; - fma.rn.ftz.f32 %f448, %f554, %f36, %f534; - fma.rn.ftz.f32 %f449, %f555, %f36, %f535; - neg.f32 %f558, %f554; - neg.f32 %f559, %f555; - fma.rn.ftz.f32 %f456, %f558, %f36, %f534; - fma.rn.ftz.f32 %f457, %f559, %f36, %f535; - neg.ftz.f32 %f38, %f541; - add.ftz.f32 %f450, %f528, %f38; - add.ftz.f32 %f451, %f529, %f540; - sub.ftz.f32 %f458, %f528, %f38; - sub.ftz.f32 %f459, %f529, %f540; - neg.ftz.f32 %f41, %f549; - sub.ftz.f32 %f568, %f41, %f548; - sub.ftz.f32 %f569, %f548, %f549; - fma.rn.ftz.f32 %f452, %f568, %f36, %f536; - fma.rn.ftz.f32 %f453, %f569, %f36, %f537; - neg.f32 %f570, %f568; - neg.f32 %f571, %f569; - fma.rn.ftz.f32 %f460, %f570, %f36, %f536; - fma.rn.ftz.f32 %f461, %f571, %f36, %f537; - bar.sync 0; - // inline asm - mov.u32 %r83, %tid.x; - // inline asm - shl.b32 %r84, %r83, 5; - add.s32 %r86, %r52, %r84; - st.shared.v4.f32 [%r86+16], {%f454, %f456, %f458, %f460}; - st.shared.v4.f32 [%r86], {%f446, %f448, %f450, %f452}; - bar.sync 0; - // inline asm - mov.u32 %r87, %tid.x; - // inline asm - shl.b32 %r95, %r87, 2; - add.s32 %r97, %r52, %r95; - ld.shared.f32 %f51, [%r97]; - // inline asm - mov.u32 %r88, %tid.x; - // inline asm - shl.b32 %r98, %r88, 2; - add.s32 %r99, %r98, %r52; - ld.shared.f32 %f1, [%r99+512]; - // inline asm - mov.u32 %r89, %tid.x; - // inline asm - shl.b32 %r100, %r89, 2; - add.s32 %r101, %r100, %r52; - ld.shared.f32 %f2, [%r101+1024]; - // inline asm - mov.u32 %r90, %tid.x; - // inline asm - shl.b32 %r102, %r90, 2; - add.s32 %r103, %r102, %r52; - ld.shared.f32 %f3, [%r103+1536]; - // inline asm - mov.u32 %r91, %tid.x; - // inline asm - shl.b32 %r104, %r91, 2; - add.s32 %r105, %r104, %r52; - ld.shared.f32 %f4, [%r105+2048]; - // inline asm - mov.u32 %r92, %tid.x; - // inline asm - shl.b32 %r106, %r92, 2; - add.s32 %r107, %r106, %r52; - ld.shared.f32 %f5, [%r107+2560]; - // inline asm - mov.u32 %r93, %tid.x; - // inline asm - shl.b32 %r108, %r93, 2; - add.s32 %r109, %r108, %r52; - ld.shared.f32 %f6, [%r109+3072]; - // inline asm - mov.u32 %r94, %tid.x; - // inline asm - shl.b32 %r110, %r94, 2; - add.s32 %r111, %r110, %r52; - ld.shared.f32 %f7, [%r111+3584]; - bar.sync 0; - // inline asm - mov.u32 %r112, %tid.x; - // inline asm - shl.b32 %r113, %r112, 5; - add.s32 %r115, %r52, %r113; - st.shared.v4.f32 [%r115+16], {%f455, %f457, %f459, %f461}; - st.shared.v4.f32 [%r115], {%f447, %f449, %f451, %f453}; - bar.sync 0; - // inline asm - mov.u32 %r116, %tid.x; - // inline asm - shl.b32 %r124, %r116, 2; - add.s32 %r126, %r52, %r124; - ld.shared.f32 %f61, [%r126]; - // inline asm - mov.u32 %r117, %tid.x; - // inline asm - shl.b32 %r127, %r117, 2; - add.s32 %r128, %r127, %r52; - ld.shared.f32 %f8, [%r128+512]; - // inline asm - mov.u32 %r118, %tid.x; - // inline asm - shl.b32 %r129, %r118, 2; - add.s32 %r130, %r129, %r52; - ld.shared.f32 %f9, [%r130+1024]; - // inline asm - mov.u32 %r119, %tid.x; - // inline asm - shl.b32 %r131, %r119, 2; - add.s32 %r132, %r131, %r52; - ld.shared.f32 %f10, [%r132+1536]; - // inline asm - mov.u32 %r120, %tid.x; - // inline asm - shl.b32 %r133, %r120, 2; - add.s32 %r134, %r133, %r52; - ld.shared.f32 %f11, [%r134+2048]; - // inline asm - mov.u32 %r121, %tid.x; - // inline asm - shl.b32 %r135, %r121, 2; - add.s32 %r136, %r135, %r52; - ld.shared.f32 %f12, [%r136+2560]; - // inline asm - mov.u32 %r122, %tid.x; - // inline asm - shl.b32 %r137, %r122, 2; - add.s32 %r138, %r137, %r52; - ld.shared.f32 %f13, [%r138+3072]; - // inline asm - mov.u32 %r123, %tid.x; - // inline asm - shl.b32 %r139, %r123, 2; - add.s32 %r140, %r139, %r52; - ld.shared.f32 %f14, [%r140+3584]; - bar.sync 0; - mov.f32 %f90, 0f40000000; - mul.ftz.f32 %f15, %f90, 0f40490FDB; - div.rn.ftz.f32 %f91, %f15, 0f42800000; - // inline asm - mov.u32 %r141, %tid.x; - // inline asm - and.b32 %r144, %r141, 7; - cvt.rn.f32.u32 %f92, %r144; - mul.ftz.f32 %f65, %f91, %f92; - // inline asm - cos.approx.f32 %f62, %f65; - // inline asm - // inline asm - sin.approx.f32 %f64, %f65; - // inline asm - mul.ftz.f32 %f93, %f62, %f1; - neg.f32 %f94, %f64; - fma.rn.ftz.f32 %f95, %f94, %f8, %f93; - mul.ftz.f32 %f96, %f64, %f1; - fma.rn.ftz.f32 %f97, %f62, %f8, %f96; - fma.rn.ftz.f32 %f67, %f91, %f92, %f65; - // inline asm - cos.approx.f32 %f66, %f67; - // inline asm - // inline asm - sin.approx.f32 %f68, %f67; - // inline asm - mul.ftz.f32 %f98, %f66, %f2; - neg.f32 %f99, %f68; - fma.rn.ftz.f32 %f100, %f99, %f9, %f98; - mul.ftz.f32 %f101, %f68, %f2; - fma.rn.ftz.f32 %f102, %f66, %f9, %f101; - mul.ftz.f32 %f73, %f65, 0f40400000; - // inline asm - cos.approx.f32 %f70, %f73; - // inline asm - // inline asm - sin.approx.f32 %f72, %f73; - // inline asm - mul.ftz.f32 %f103, %f70, %f3; - neg.f32 %f104, %f72; - fma.rn.ftz.f32 %f105, %f104, %f10, %f103; - mul.ftz.f32 %f106, %f72, %f3; - fma.rn.ftz.f32 %f107, %f70, %f10, %f106; - mul.ftz.f32 %f77, %f65, 0f40800000; - // inline asm - cos.approx.f32 %f74, %f77; - // inline asm - // inline asm - sin.approx.f32 %f76, %f77; - // inline asm - mul.ftz.f32 %f108, %f74, %f4; - neg.f32 %f109, %f76; - fma.rn.ftz.f32 %f110, %f109, %f11, %f108; - mul.ftz.f32 %f111, %f76, %f4; - fma.rn.ftz.f32 %f112, %f74, %f11, %f111; - mul.ftz.f32 %f81, %f65, 0f40A00000; - // inline asm - cos.approx.f32 %f78, %f81; - // inline asm - // inline asm - sin.approx.f32 %f80, %f81; - // inline asm - mul.ftz.f32 %f113, %f78, %f5; - neg.f32 %f114, %f80; - fma.rn.ftz.f32 %f115, %f114, %f12, %f113; - mul.ftz.f32 %f116, %f80, %f5; - fma.rn.ftz.f32 %f117, %f78, %f12, %f116; - mul.ftz.f32 %f85, %f65, 0f40C00000; - // inline asm - cos.approx.f32 %f82, %f85; - // inline asm - // inline asm - sin.approx.f32 %f84, %f85; - // inline asm - mul.ftz.f32 %f118, %f82, %f6; - neg.f32 %f119, %f84; - fma.rn.ftz.f32 %f120, %f119, %f13, %f118; - mul.ftz.f32 %f121, %f84, %f6; - fma.rn.ftz.f32 %f122, %f82, %f13, %f121; - mul.ftz.f32 %f89, %f65, 0f40E00000; - // inline asm - cos.approx.f32 %f86, %f89; - // inline asm - // inline asm - sin.approx.f32 %f88, %f89; - // inline asm - mul.ftz.f32 %f123, %f86, %f7; - neg.f32 %f124, %f88; - fma.rn.ftz.f32 %f125, %f124, %f14, %f123; - mul.ftz.f32 %f126, %f88, %f7; - fma.rn.ftz.f32 %f127, %f86, %f14, %f126; - add.ftz.f32 %f380, %f51, %f110; - add.ftz.f32 %f381, %f61, %f112; - sub.ftz.f32 %f384, %f51, %f110; - sub.ftz.f32 %f385, %f61, %f112; - add.ftz.f32 %f386, %f100, %f120; - add.ftz.f32 %f387, %f102, %f122; - sub.ftz.f32 %f388, %f100, %f120; - sub.ftz.f32 %f389, %f102, %f122; - add.ftz.f32 %f390, %f95, %f115; - add.ftz.f32 %f391, %f97, %f117; - sub.ftz.f32 %f392, %f95, %f115; - sub.ftz.f32 %f393, %f97, %f117; - add.ftz.f32 %f394, %f105, %f125; - add.ftz.f32 %f395, %f107, %f127; - sub.ftz.f32 %f396, %f105, %f125; - sub.ftz.f32 %f397, %f107, %f127; - add.ftz.f32 %f398, %f380, %f386; - add.ftz.f32 %f399, %f381, %f387; - sub.ftz.f32 %f400, %f380, %f386; - sub.ftz.f32 %f401, %f381, %f387; - neg.ftz.f32 %f129, %f389; - add.ftz.f32 %f406, %f384, %f129; - add.ftz.f32 %f407, %f385, %f388; - sub.ftz.f32 %f408, %f384, %f129; - sub.ftz.f32 %f409, %f385, %f388; - add.ftz.f32 %f410, %f390, %f394; - add.ftz.f32 %f411, %f391, %f395; - sub.ftz.f32 %f412, %f390, %f394; - sub.ftz.f32 %f413, %f391, %f395; - neg.ftz.f32 %f132, %f397; - add.ftz.f32 %f418, %f392, %f132; - add.ftz.f32 %f419, %f393, %f396; - sub.ftz.f32 %f420, %f392, %f132; - sub.ftz.f32 %f421, %f393, %f396; - add.ftz.f32 %f348, %f398, %f410; - add.ftz.f32 %f349, %f399, %f411; - sub.ftz.f32 %f356, %f398, %f410; - sub.ftz.f32 %f357, %f399, %f411; - neg.ftz.f32 %f135, %f419; - add.ftz.f32 %f426, %f135, %f418; - add.ftz.f32 %f427, %f418, %f419; - fma.rn.ftz.f32 %f350, %f426, %f36, %f406; - fma.rn.ftz.f32 %f351, %f427, %f36, %f407; - neg.f32 %f430, %f426; - neg.f32 %f431, %f427; - fma.rn.ftz.f32 %f358, %f430, %f36, %f406; - fma.rn.ftz.f32 %f359, %f431, %f36, %f407; - neg.ftz.f32 %f139, %f413; - add.ftz.f32 %f352, %f400, %f139; - add.ftz.f32 %f353, %f401, %f412; - sub.ftz.f32 %f360, %f400, %f139; - sub.ftz.f32 %f361, %f401, %f412; - neg.ftz.f32 %f142, %f421; - sub.ftz.f32 %f440, %f142, %f420; - sub.ftz.f32 %f441, %f420, %f421; - fma.rn.ftz.f32 %f354, %f440, %f36, %f408; - fma.rn.ftz.f32 %f355, %f441, %f36, %f409; - neg.f32 %f442, %f440; - neg.f32 %f443, %f441; - fma.rn.ftz.f32 %f362, %f442, %f36, %f408; - fma.rn.ftz.f32 %f363, %f443, %f36, %f409; - // inline asm - mov.u32 %r142, %tid.x; - // inline asm - shl.b32 %r145, %r142, 3; - // inline asm - mov.u32 %r143, %tid.x; - // inline asm - and.b32 %r146, %r143, 7; - and.b32 %r147, %r145, 1073741760; - add.s32 %r148, %r147, %r146; - shl.b32 %r149, %r148, 2; - add.s32 %r1, %r52, %r149; - st.shared.f32 [%r1], %f348; - st.shared.f32 [%r1+32], %f350; - st.shared.f32 [%r1+64], %f352; - st.shared.f32 [%r1+96], %f354; - st.shared.f32 [%r1+128], %f356; - st.shared.f32 [%r1+160], %f358; - st.shared.f32 [%r1+192], %f360; - st.shared.f32 [%r1+224], %f362; - bar.sync 0; - // inline asm - mov.u32 %r151, %tid.x; - // inline asm - shl.b32 %r155, %r151, 3; - add.s32 %r157, %r52, %r155; - ld.shared.v2.f32 {%f344, %f345}, [%r157]; - // inline asm - mov.u32 %r152, %tid.x; - // inline asm - shl.b32 %r158, %r152, 3; - add.s32 %r159, %r158, %r52; - ld.shared.v2.f32 {%f282, %f283}, [%r159+1024]; - // inline asm - mov.u32 %r153, %tid.x; - // inline asm - shl.b32 %r160, %r153, 3; - add.s32 %r161, %r160, %r52; - ld.shared.v2.f32 {%f288, %f289}, [%r161+2048]; - // inline asm - mov.u32 %r154, %tid.x; - // inline asm - shl.b32 %r162, %r154, 3; - add.s32 %r163, %r162, %r52; - ld.shared.v2.f32 {%f294, %f295}, [%r163+3072]; - bar.sync 0; - st.shared.f32 [%r1], %f349; - st.shared.f32 [%r1+32], %f351; - st.shared.f32 [%r1+64], %f353; - st.shared.f32 [%r1+96], %f355; - st.shared.f32 [%r1+128], %f357; - st.shared.f32 [%r1+160], %f359; - st.shared.f32 [%r1+192], %f361; - st.shared.f32 [%r1+224], %f363; - bar.sync 0; - // inline asm - mov.u32 %r164, %tid.x; - // inline asm - shl.b32 %r168, %r164, 3; - add.s32 %r170, %r52, %r168; - ld.shared.v2.f32 {%f342, %f343}, [%r170]; - // inline asm - mov.u32 %r165, %tid.x; - // inline asm - shl.b32 %r171, %r165, 3; - add.s32 %r172, %r171, %r52; - ld.shared.v2.f32 {%f284, %f285}, [%r172+1024]; - // inline asm - mov.u32 %r166, %tid.x; - // inline asm - shl.b32 %r173, %r166, 3; - add.s32 %r174, %r173, %r52; - ld.shared.v2.f32 {%f290, %f291}, [%r174+2048]; - // inline asm - mov.u32 %r167, %tid.x; - // inline asm - shl.b32 %r175, %r167, 3; - add.s32 %r176, %r175, %r52; - ld.shared.v2.f32 {%f296, %f297}, [%r176+3072]; - bar.sync 0; - div.rn.ftz.f32 %f184, %f15, 0f43800000; - // inline asm - mov.u32 %r177, %tid.x; - // inline asm - shl.b32 %r180, %r177, 1; - and.b32 %r181, %r180, 62; - cvt.rn.f32.u32 %f185, %r181; - mul.ftz.f32 %f163, %f184, %f185; - // inline asm - cos.approx.f32 %f160, %f163; - // inline asm - // inline asm - sin.approx.f32 %f162, %f163; - // inline asm - mul.ftz.f32 %f187, %f160, %f282; - neg.f32 %f189, %f162; - fma.rn.ftz.f32 %f190, %f189, %f284, %f187; - mul.ftz.f32 %f191, %f162, %f282; - fma.rn.ftz.f32 %f192, %f160, %f284, %f191; - fma.rn.ftz.f32 %f165, %f184, %f185, %f163; - // inline asm - cos.approx.f32 %f164, %f165; - // inline asm - // inline asm - sin.approx.f32 %f166, %f165; - // inline asm - mul.ftz.f32 %f194, %f164, %f288; - neg.f32 %f196, %f166; - fma.rn.ftz.f32 %f197, %f196, %f290, %f194; - mul.ftz.f32 %f198, %f166, %f288; - fma.rn.ftz.f32 %f199, %f164, %f290, %f198; - mul.ftz.f32 %f171, %f163, 0f40400000; - // inline asm - cos.approx.f32 %f168, %f171; - // inline asm - // inline asm - sin.approx.f32 %f170, %f171; - // inline asm - mul.ftz.f32 %f201, %f168, %f294; - neg.f32 %f203, %f170; - fma.rn.ftz.f32 %f204, %f203, %f296, %f201; - mul.ftz.f32 %f205, %f170, %f294; - fma.rn.ftz.f32 %f206, %f168, %f296, %f205; - fma.rn.ftz.f32 %f175, %f184, %f185, %f184; - // inline asm - cos.approx.f32 %f172, %f175; - // inline asm - // inline asm - sin.approx.f32 %f174, %f175; - // inline asm - mul.ftz.f32 %f208, %f172, %f283; - neg.f32 %f210, %f174; - fma.rn.ftz.f32 %f211, %f210, %f285, %f208; - mul.ftz.f32 %f212, %f174, %f283; - fma.rn.ftz.f32 %f213, %f172, %f285, %f212; - add.ftz.f32 %f177, %f175, %f175; - // inline asm - cos.approx.f32 %f176, %f177; - // inline asm - // inline asm - sin.approx.f32 %f178, %f177; - // inline asm - mul.ftz.f32 %f215, %f176, %f289; - neg.f32 %f217, %f178; - fma.rn.ftz.f32 %f218, %f217, %f291, %f215; - mul.ftz.f32 %f219, %f178, %f289; - fma.rn.ftz.f32 %f220, %f176, %f291, %f219; - mul.ftz.f32 %f183, %f175, 0f40400000; - // inline asm - cos.approx.f32 %f180, %f183; - // inline asm - // inline asm - sin.approx.f32 %f182, %f183; - // inline asm - mul.ftz.f32 %f222, %f180, %f295; - neg.f32 %f224, %f182; - fma.rn.ftz.f32 %f225, %f224, %f297, %f222; - mul.ftz.f32 %f226, %f182, %f295; - fma.rn.ftz.f32 %f227, %f180, %f297, %f226; - add.ftz.f32 %f306, %f344, %f197; - add.ftz.f32 %f307, %f342, %f199; - sub.ftz.f32 %f310, %f344, %f197; - sub.ftz.f32 %f311, %f342, %f199; - add.ftz.f32 %f312, %f190, %f204; - add.ftz.f32 %f313, %f192, %f206; - sub.ftz.f32 %f314, %f190, %f204; - sub.ftz.f32 %f315, %f192, %f206; - add.ftz.f32 %f260, %f306, %f312; - add.ftz.f32 %f261, %f307, %f313; - sub.ftz.f32 %f272, %f306, %f312; - sub.ftz.f32 %f273, %f307, %f313; - neg.ftz.f32 %f229, %f315; - add.ftz.f32 %f266, %f310, %f229; - add.ftz.f32 %f267, %f311, %f314; - sub.ftz.f32 %f278, %f310, %f229; - sub.ftz.f32 %f279, %f311, %f314; - add.ftz.f32 %f320, %f345, %f218; - add.ftz.f32 %f321, %f343, %f220; - sub.ftz.f32 %f324, %f345, %f218; - sub.ftz.f32 %f325, %f343, %f220; - add.ftz.f32 %f326, %f211, %f225; - add.ftz.f32 %f327, %f213, %f227; - sub.ftz.f32 %f328, %f211, %f225; - sub.ftz.f32 %f329, %f213, %f227; - add.ftz.f32 %f262, %f320, %f326; - add.ftz.f32 %f263, %f321, %f327; - sub.ftz.f32 %f274, %f320, %f326; - sub.ftz.f32 %f275, %f321, %f327; - neg.ftz.f32 %f232, %f329; - add.ftz.f32 %f268, %f324, %f232; - add.ftz.f32 %f269, %f325, %f328; - sub.ftz.f32 %f280, %f324, %f232; - sub.ftz.f32 %f281, %f325, %f328; - // inline asm - mov.u32 %r178, %tid.x; - // inline asm - shl.b32 %r182, %r178, 2; - // inline asm - mov.u32 %r179, %tid.x; - // inline asm - and.b32 %r183, %r179, 31; - and.b32 %r184, %r182, 536870784; - add.s32 %r185, %r184, %r183; - shl.b32 %r186, %r185, 3; - add.s32 %r188, %r52, %r186; - st.shared.v2.f32 [%r188], {%f260, %f262}; - st.shared.v2.f32 [%r188+256], {%f266, %f268}; - st.shared.v2.f32 [%r188+512], {%f272, %f274}; - st.shared.v2.f32 [%r188+768], {%f278, %f280}; - bar.sync 0; - // inline asm - mov.u32 %r193, %tid.x; - // inline asm - shl.b32 %r197, %r193, 3; - add.s32 %r199, %r52, %r197; - st.shared.v2.f32 [%r199], {%f261, %f263}; - // inline asm - mov.u32 %r194, %tid.x; - // inline asm - shl.b32 %r200, %r194, 3; - add.s32 %r201, %r200, %r52; - st.shared.v2.f32 [%r201+1024], {%f267, %f269}; - // inline asm - mov.u32 %r195, %tid.x; - // inline asm - shl.b32 %r202, %r195, 3; - add.s32 %r203, %r202, %r52; - st.shared.v2.f32 [%r203+2048], {%f273, %f275}; - // inline asm - mov.u32 %r196, %tid.x; - // inline asm - shl.b32 %r204, %r196, 3; - add.s32 %r205, %r204, %r52; - st.shared.v2.f32 [%r205+3072], {%f279, %f281}; - bar.sync 0; - ret; -} - - diff --git a/RTCP/GPUProc/src/UHEP/InvFIR.cl-0.ptx b/RTCP/GPUProc/src/UHEP/InvFIR.cl-0.ptx deleted file mode 100644 index 2179b103dc7..00000000000 --- a/RTCP/GPUProc/src/UHEP/InvFIR.cl-0.ptx +++ /dev/null @@ -1,447 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Tue Feb 7 07:15:59 2012 (1328595359) -// Driver 295.20 -// - -.version 3.0 -.target sm_21, texmode_independent -.address_size 32 - - -.entry invFIRfilter( - .param .u32 .ptr .global .align 1 invFIRfilter_param_0, - .param .u32 .ptr .global .align 1 invFIRfilter_param_1, - .param .u32 .ptr .global .align 1 invFIRfilter_param_2 -) -{ - .reg .f32 %f<386>; - .reg .pred %p<2>; - .reg .s32 %r<71>; - - - ld.param.u32 %r21, [invFIRfilter_param_0]; - ld.param.u32 %r22, [invFIRfilter_param_1]; - ld.param.u32 %r23, [invFIRfilter_param_2]; - // inline asm - mov.u32 %r7, %envreg3; - // inline asm - // inline asm - mov.u32 %r8, %ntid.x; - // inline asm - // inline asm - mov.u32 %r9, %ctaid.x; - // inline asm - mul.lo.s32 %r24, %r9, %r8; - // inline asm - mov.u32 %r10, %tid.x; - // inline asm - add.s32 %r25, %r10, %r7; - mad.lo.s32 %r26, %r9, %r8, %r25; - // inline asm - mov.u32 %r11, %envreg4; - // inline asm - // inline asm - mov.u32 %r12, %ntid.y; - // inline asm - // inline asm - mov.u32 %r13, %ctaid.y; - // inline asm - mul.lo.s32 %r27, %r13, %r12; - // inline asm - mov.u32 %r14, %tid.y; - // inline asm - add.s32 %r28, %r14, %r11; - mad.lo.s32 %r29, %r13, %r12, %r28; - // inline asm - mov.u32 %r15, %envreg5; - // inline asm - // inline asm - mov.u32 %r16, %ntid.z; - // inline asm - // inline asm - mov.u32 %r17, %ctaid.z; - // inline asm - mul.lo.s32 %r30, %r17, %r16; - // inline asm - mov.u32 %r18, %tid.z; - // inline asm - add.s32 %r31, %r18, %r15; - mad.lo.s32 %r32, %r17, %r16, %r31; - shl.b32 %r33, %r26, 6; - add.s32 %r34, %r23, %r33; - mad.lo.s32 %r35, %r32, 8511488, %r22; - mad.lo.s32 %r36, %r29, 4255744, %r35; - shl.b32 %r37, %r26, 2; - add.s32 %r38, %r36, %r37; - ld.global.f32 %f17, [%r38]; - mov.u32 %r70, 0; - ld.global.f32 %f18, [%r38+4096]; - ld.global.f32 %f19, [%r38+8192]; - ld.global.f32 %f20, [%r38+12288]; - ld.global.f32 %f21, [%r38+16384]; - ld.global.f32 %f22, [%r38+20480]; - ld.global.f32 %f23, [%r38+24576]; - ld.global.f32 %f24, [%r38+28672]; - ld.global.f32 %f25, [%r38+32768]; - ld.global.f32 %f26, [%r38+36864]; - ld.global.f32 %f27, [%r38+40960]; - ld.global.f32 %f28, [%r38+45056]; - ld.global.f32 %f29, [%r38+49152]; - ld.global.f32 %f30, [%r38+53248]; - ld.global.f32 %f31, [%r38+57344]; - ld.global.v4.f32 {%f367, %f368, %f369, %f370}, [%r34+48]; - ld.global.v4.f32 {%f371, %f372, %f373, %f374}, [%r34+32]; - ld.global.v4.f32 {%f375, %f376, %f377, %f378}, [%r34+16]; - ld.global.v4.f32 {%f379, %f380, %f381, %f382}, [%r34]; - shl.b32 %r39, %r30, 23; - shl.b32 %r40, %r15, 23; - add.s32 %r41, %r39, %r40; - shl.b32 %r42, %r18, 23; - add.s32 %r43, %r41, %r42; - shl.b32 %r44, %r27, 22; - add.s32 %r45, %r43, %r44; - shl.b32 %r46, %r11, 22; - add.s32 %r47, %r45, %r46; - shl.b32 %r48, %r14, 22; - add.s32 %r49, %r47, %r48; - shl.b32 %r50, %r24, 2; - add.s32 %r51, %r49, %r50; - shl.b32 %r52, %r7, 2; - add.s32 %r53, %r51, %r52; - shl.b32 %r54, %r10, 2; - add.s32 %r55, %r53, %r54; - add.s32 %r56, %r55, %r21; - add.s32 %r1, %r56, 32768; - mul.lo.s32 %r57, %r15, 8511488; - mad.lo.s32 %r58, %r30, 8511488, %r57; - mad.lo.s32 %r59, %r18, 8511488, %r58; - mad.lo.s32 %r60, %r27, 4255744, %r59; - mad.lo.s32 %r61, %r11, 4255744, %r60; - mad.lo.s32 %r62, %r14, 4255744, %r61; - add.s32 %r63, %r62, %r50; - add.s32 %r64, %r63, %r52; - add.s32 %r65, %r64, %r54; - add.s32 %r66, %r65, %r22; - add.s32 %r2, %r66, 122880; - mov.f32 %f347, %f25; - mov.f32 %f348, %f26; - mov.f32 %f349, %f27; - mov.f32 %f350, %f28; - mov.f32 %f335, %f21; - mov.f32 %f336, %f22; - mov.f32 %f337, %f23; - mov.f32 %f338, %f24; - mov.f32 %f323, %f17; - mov.f32 %f324, %f18; - mov.f32 %f325, %f19; - mov.f32 %f326, %f20; - mov.f32 %f383, %f29; - mov.f32 %f384, %f30; - mov.f32 %f385, %f31; - mov.f32 %f362, %f32; - mov.u32 %r69, 64; - -BB0_1: - mul.ftz.f32 %f35, %f369, %f324; - fma.rn.ftz.f32 %f36, %f370, %f323, %f35; - fma.rn.ftz.f32 %f38, %f368, %f325, %f36; - fma.rn.ftz.f32 %f40, %f367, %f326, %f38; - fma.rn.ftz.f32 %f42, %f374, %f335, %f40; - fma.rn.ftz.f32 %f44, %f373, %f336, %f42; - fma.rn.ftz.f32 %f46, %f372, %f337, %f44; - fma.rn.ftz.f32 %f48, %f371, %f338, %f46; - fma.rn.ftz.f32 %f50, %f378, %f347, %f48; - fma.rn.ftz.f32 %f52, %f377, %f348, %f50; - fma.rn.ftz.f32 %f54, %f376, %f349, %f52; - fma.rn.ftz.f32 %f56, %f375, %f350, %f54; - fma.rn.ftz.f32 %f58, %f382, %f383, %f56; - fma.rn.ftz.f32 %f60, %f381, %f384, %f58; - fma.rn.ftz.f32 %f62, %f380, %f385, %f60; - add.s32 %r67, %r2, %r70; - ld.global.f32 %f63, [%r67+-57344]; - fma.rn.ftz.f32 %f64, %f379, %f63, %f62; - add.s32 %r68, %r1, %r70; - st.global.f32 [%r68+-32768], %f64; - mul.ftz.f32 %f65, %f369, %f325; - fma.rn.ftz.f32 %f66, %f370, %f324, %f65; - fma.rn.ftz.f32 %f67, %f368, %f326, %f66; - fma.rn.ftz.f32 %f68, %f367, %f335, %f67; - fma.rn.ftz.f32 %f69, %f374, %f336, %f68; - fma.rn.ftz.f32 %f70, %f373, %f337, %f69; - fma.rn.ftz.f32 %f71, %f372, %f338, %f70; - fma.rn.ftz.f32 %f72, %f371, %f347, %f71; - fma.rn.ftz.f32 %f73, %f378, %f348, %f72; - fma.rn.ftz.f32 %f74, %f377, %f349, %f73; - fma.rn.ftz.f32 %f75, %f376, %f350, %f74; - fma.rn.ftz.f32 %f76, %f375, %f383, %f75; - fma.rn.ftz.f32 %f77, %f382, %f384, %f76; - fma.rn.ftz.f32 %f78, %f381, %f385, %f77; - ld.global.f32 %f79, [%r67+-53248]; - fma.rn.ftz.f32 %f80, %f380, %f79, %f78; - fma.rn.ftz.f32 %f81, %f379, %f323, %f80; - st.global.f32 [%r68+-28672], %f81; - mul.ftz.f32 %f82, %f369, %f326; - fma.rn.ftz.f32 %f83, %f370, %f325, %f82; - fma.rn.ftz.f32 %f84, %f368, %f335, %f83; - fma.rn.ftz.f32 %f85, %f367, %f336, %f84; - fma.rn.ftz.f32 %f86, %f374, %f337, %f85; - fma.rn.ftz.f32 %f87, %f373, %f338, %f86; - fma.rn.ftz.f32 %f88, %f372, %f347, %f87; - fma.rn.ftz.f32 %f89, %f371, %f348, %f88; - fma.rn.ftz.f32 %f90, %f378, %f349, %f89; - fma.rn.ftz.f32 %f91, %f377, %f350, %f90; - fma.rn.ftz.f32 %f92, %f376, %f383, %f91; - fma.rn.ftz.f32 %f93, %f375, %f384, %f92; - fma.rn.ftz.f32 %f94, %f382, %f385, %f93; - ld.global.f32 %f95, [%r67+-49152]; - fma.rn.ftz.f32 %f96, %f381, %f95, %f94; - fma.rn.ftz.f32 %f97, %f380, %f323, %f96; - fma.rn.ftz.f32 %f98, %f379, %f324, %f97; - st.global.f32 [%r68+-24576], %f98; - mul.ftz.f32 %f99, %f369, %f335; - fma.rn.ftz.f32 %f100, %f370, %f326, %f99; - fma.rn.ftz.f32 %f101, %f368, %f336, %f100; - fma.rn.ftz.f32 %f102, %f367, %f337, %f101; - fma.rn.ftz.f32 %f103, %f374, %f338, %f102; - fma.rn.ftz.f32 %f104, %f373, %f347, %f103; - fma.rn.ftz.f32 %f105, %f372, %f348, %f104; - fma.rn.ftz.f32 %f106, %f371, %f349, %f105; - fma.rn.ftz.f32 %f107, %f378, %f350, %f106; - fma.rn.ftz.f32 %f108, %f377, %f383, %f107; - fma.rn.ftz.f32 %f109, %f376, %f384, %f108; - fma.rn.ftz.f32 %f110, %f375, %f385, %f109; - ld.global.f32 %f111, [%r67+-45056]; - fma.rn.ftz.f32 %f112, %f382, %f111, %f110; - fma.rn.ftz.f32 %f113, %f381, %f323, %f112; - fma.rn.ftz.f32 %f114, %f380, %f324, %f113; - fma.rn.ftz.f32 %f115, %f379, %f325, %f114; - st.global.f32 [%r68+-20480], %f115; - mul.ftz.f32 %f116, %f369, %f336; - fma.rn.ftz.f32 %f117, %f370, %f335, %f116; - fma.rn.ftz.f32 %f118, %f368, %f337, %f117; - fma.rn.ftz.f32 %f119, %f367, %f338, %f118; - fma.rn.ftz.f32 %f120, %f374, %f347, %f119; - fma.rn.ftz.f32 %f121, %f373, %f348, %f120; - fma.rn.ftz.f32 %f122, %f372, %f349, %f121; - fma.rn.ftz.f32 %f123, %f371, %f350, %f122; - fma.rn.ftz.f32 %f124, %f378, %f383, %f123; - fma.rn.ftz.f32 %f125, %f377, %f384, %f124; - fma.rn.ftz.f32 %f126, %f376, %f385, %f125; - ld.global.f32 %f127, [%r67+-40960]; - fma.rn.ftz.f32 %f128, %f375, %f127, %f126; - fma.rn.ftz.f32 %f129, %f382, %f323, %f128; - fma.rn.ftz.f32 %f130, %f381, %f324, %f129; - fma.rn.ftz.f32 %f131, %f380, %f325, %f130; - fma.rn.ftz.f32 %f132, %f379, %f326, %f131; - st.global.f32 [%r68+-16384], %f132; - mul.ftz.f32 %f133, %f369, %f337; - fma.rn.ftz.f32 %f134, %f370, %f336, %f133; - fma.rn.ftz.f32 %f135, %f368, %f338, %f134; - fma.rn.ftz.f32 %f136, %f367, %f347, %f135; - fma.rn.ftz.f32 %f137, %f374, %f348, %f136; - fma.rn.ftz.f32 %f138, %f373, %f349, %f137; - fma.rn.ftz.f32 %f139, %f372, %f350, %f138; - fma.rn.ftz.f32 %f140, %f371, %f383, %f139; - fma.rn.ftz.f32 %f141, %f378, %f384, %f140; - fma.rn.ftz.f32 %f142, %f377, %f385, %f141; - ld.global.f32 %f143, [%r67+-36864]; - fma.rn.ftz.f32 %f144, %f376, %f143, %f142; - fma.rn.ftz.f32 %f145, %f375, %f323, %f144; - fma.rn.ftz.f32 %f146, %f382, %f324, %f145; - fma.rn.ftz.f32 %f147, %f381, %f325, %f146; - fma.rn.ftz.f32 %f148, %f380, %f326, %f147; - fma.rn.ftz.f32 %f149, %f379, %f335, %f148; - st.global.f32 [%r68+-12288], %f149; - mul.ftz.f32 %f150, %f369, %f338; - fma.rn.ftz.f32 %f151, %f370, %f337, %f150; - fma.rn.ftz.f32 %f152, %f368, %f347, %f151; - fma.rn.ftz.f32 %f153, %f367, %f348, %f152; - fma.rn.ftz.f32 %f154, %f374, %f349, %f153; - fma.rn.ftz.f32 %f155, %f373, %f350, %f154; - fma.rn.ftz.f32 %f156, %f372, %f383, %f155; - fma.rn.ftz.f32 %f157, %f371, %f384, %f156; - fma.rn.ftz.f32 %f158, %f378, %f385, %f157; - ld.global.f32 %f159, [%r67+-32768]; - fma.rn.ftz.f32 %f160, %f377, %f159, %f158; - fma.rn.ftz.f32 %f161, %f376, %f323, %f160; - fma.rn.ftz.f32 %f162, %f375, %f324, %f161; - fma.rn.ftz.f32 %f163, %f382, %f325, %f162; - fma.rn.ftz.f32 %f164, %f381, %f326, %f163; - fma.rn.ftz.f32 %f165, %f380, %f335, %f164; - fma.rn.ftz.f32 %f166, %f379, %f336, %f165; - st.global.f32 [%r68+-8192], %f166; - mul.ftz.f32 %f167, %f369, %f347; - fma.rn.ftz.f32 %f168, %f370, %f338, %f167; - fma.rn.ftz.f32 %f169, %f368, %f348, %f168; - fma.rn.ftz.f32 %f170, %f367, %f349, %f169; - fma.rn.ftz.f32 %f171, %f374, %f350, %f170; - fma.rn.ftz.f32 %f172, %f373, %f383, %f171; - fma.rn.ftz.f32 %f173, %f372, %f384, %f172; - fma.rn.ftz.f32 %f174, %f371, %f385, %f173; - ld.global.f32 %f175, [%r67+-28672]; - fma.rn.ftz.f32 %f176, %f378, %f175, %f174; - fma.rn.ftz.f32 %f177, %f377, %f323, %f176; - fma.rn.ftz.f32 %f178, %f376, %f324, %f177; - fma.rn.ftz.f32 %f179, %f375, %f325, %f178; - fma.rn.ftz.f32 %f180, %f382, %f326, %f179; - fma.rn.ftz.f32 %f181, %f381, %f335, %f180; - fma.rn.ftz.f32 %f182, %f380, %f336, %f181; - fma.rn.ftz.f32 %f183, %f379, %f337, %f182; - st.global.f32 [%r68+-4096], %f183; - mul.ftz.f32 %f184, %f369, %f348; - fma.rn.ftz.f32 %f185, %f370, %f347, %f184; - fma.rn.ftz.f32 %f186, %f368, %f349, %f185; - fma.rn.ftz.f32 %f187, %f367, %f350, %f186; - fma.rn.ftz.f32 %f188, %f374, %f383, %f187; - fma.rn.ftz.f32 %f189, %f373, %f384, %f188; - fma.rn.ftz.f32 %f190, %f372, %f385, %f189; - ld.global.f32 %f191, [%r67+-24576]; - fma.rn.ftz.f32 %f192, %f371, %f191, %f190; - fma.rn.ftz.f32 %f193, %f378, %f323, %f192; - fma.rn.ftz.f32 %f194, %f377, %f324, %f193; - fma.rn.ftz.f32 %f195, %f376, %f325, %f194; - fma.rn.ftz.f32 %f196, %f375, %f326, %f195; - fma.rn.ftz.f32 %f197, %f382, %f335, %f196; - fma.rn.ftz.f32 %f198, %f381, %f336, %f197; - fma.rn.ftz.f32 %f199, %f380, %f337, %f198; - fma.rn.ftz.f32 %f200, %f379, %f338, %f199; - st.global.f32 [%r68], %f200; - mul.ftz.f32 %f201, %f369, %f349; - fma.rn.ftz.f32 %f202, %f370, %f348, %f201; - fma.rn.ftz.f32 %f203, %f368, %f350, %f202; - fma.rn.ftz.f32 %f204, %f367, %f383, %f203; - fma.rn.ftz.f32 %f205, %f374, %f384, %f204; - fma.rn.ftz.f32 %f206, %f373, %f385, %f205; - ld.global.f32 %f207, [%r67+-20480]; - fma.rn.ftz.f32 %f208, %f372, %f207, %f206; - fma.rn.ftz.f32 %f209, %f371, %f323, %f208; - fma.rn.ftz.f32 %f210, %f378, %f324, %f209; - fma.rn.ftz.f32 %f211, %f377, %f325, %f210; - fma.rn.ftz.f32 %f212, %f376, %f326, %f211; - fma.rn.ftz.f32 %f213, %f375, %f335, %f212; - fma.rn.ftz.f32 %f214, %f382, %f336, %f213; - fma.rn.ftz.f32 %f215, %f381, %f337, %f214; - fma.rn.ftz.f32 %f216, %f380, %f338, %f215; - fma.rn.ftz.f32 %f217, %f379, %f347, %f216; - st.global.f32 [%r68+4096], %f217; - mul.ftz.f32 %f218, %f369, %f350; - fma.rn.ftz.f32 %f219, %f370, %f349, %f218; - fma.rn.ftz.f32 %f220, %f368, %f383, %f219; - fma.rn.ftz.f32 %f221, %f367, %f384, %f220; - fma.rn.ftz.f32 %f222, %f374, %f385, %f221; - ld.global.f32 %f223, [%r67+-16384]; - fma.rn.ftz.f32 %f224, %f373, %f223, %f222; - fma.rn.ftz.f32 %f225, %f372, %f323, %f224; - fma.rn.ftz.f32 %f226, %f371, %f324, %f225; - fma.rn.ftz.f32 %f227, %f378, %f325, %f226; - fma.rn.ftz.f32 %f228, %f377, %f326, %f227; - fma.rn.ftz.f32 %f229, %f376, %f335, %f228; - fma.rn.ftz.f32 %f230, %f375, %f336, %f229; - fma.rn.ftz.f32 %f231, %f382, %f337, %f230; - fma.rn.ftz.f32 %f232, %f381, %f338, %f231; - fma.rn.ftz.f32 %f233, %f380, %f347, %f232; - fma.rn.ftz.f32 %f234, %f379, %f348, %f233; - st.global.f32 [%r68+8192], %f234; - mul.ftz.f32 %f235, %f369, %f383; - fma.rn.ftz.f32 %f236, %f370, %f350, %f235; - fma.rn.ftz.f32 %f237, %f368, %f384, %f236; - fma.rn.ftz.f32 %f238, %f367, %f385, %f237; - ld.global.f32 %f239, [%r67+-12288]; - fma.rn.ftz.f32 %f240, %f374, %f239, %f238; - fma.rn.ftz.f32 %f241, %f373, %f323, %f240; - fma.rn.ftz.f32 %f242, %f372, %f324, %f241; - fma.rn.ftz.f32 %f243, %f371, %f325, %f242; - fma.rn.ftz.f32 %f244, %f378, %f326, %f243; - fma.rn.ftz.f32 %f245, %f377, %f335, %f244; - fma.rn.ftz.f32 %f246, %f376, %f336, %f245; - fma.rn.ftz.f32 %f247, %f375, %f337, %f246; - fma.rn.ftz.f32 %f248, %f382, %f338, %f247; - fma.rn.ftz.f32 %f249, %f381, %f347, %f248; - fma.rn.ftz.f32 %f250, %f380, %f348, %f249; - fma.rn.ftz.f32 %f251, %f379, %f349, %f250; - st.global.f32 [%r68+12288], %f251; - mul.ftz.f32 %f252, %f369, %f384; - fma.rn.ftz.f32 %f253, %f370, %f383, %f252; - fma.rn.ftz.f32 %f254, %f368, %f385, %f253; - ld.global.f32 %f255, [%r67+-8192]; - fma.rn.ftz.f32 %f256, %f367, %f255, %f254; - fma.rn.ftz.f32 %f257, %f374, %f323, %f256; - fma.rn.ftz.f32 %f258, %f373, %f324, %f257; - fma.rn.ftz.f32 %f259, %f372, %f325, %f258; - fma.rn.ftz.f32 %f260, %f371, %f326, %f259; - fma.rn.ftz.f32 %f261, %f378, %f335, %f260; - fma.rn.ftz.f32 %f262, %f377, %f336, %f261; - fma.rn.ftz.f32 %f263, %f376, %f337, %f262; - fma.rn.ftz.f32 %f264, %f375, %f338, %f263; - fma.rn.ftz.f32 %f265, %f382, %f347, %f264; - fma.rn.ftz.f32 %f266, %f381, %f348, %f265; - fma.rn.ftz.f32 %f267, %f380, %f349, %f266; - fma.rn.ftz.f32 %f268, %f379, %f350, %f267; - st.global.f32 [%r68+16384], %f268; - mul.ftz.f32 %f269, %f369, %f385; - fma.rn.ftz.f32 %f270, %f370, %f384, %f269; - ld.global.f32 %f271, [%r67+-4096]; - fma.rn.ftz.f32 %f272, %f368, %f271, %f270; - fma.rn.ftz.f32 %f273, %f367, %f323, %f272; - fma.rn.ftz.f32 %f274, %f374, %f324, %f273; - fma.rn.ftz.f32 %f275, %f373, %f325, %f274; - fma.rn.ftz.f32 %f276, %f372, %f326, %f275; - fma.rn.ftz.f32 %f277, %f371, %f335, %f276; - fma.rn.ftz.f32 %f278, %f378, %f336, %f277; - fma.rn.ftz.f32 %f279, %f377, %f337, %f278; - fma.rn.ftz.f32 %f280, %f376, %f338, %f279; - fma.rn.ftz.f32 %f281, %f375, %f347, %f280; - fma.rn.ftz.f32 %f282, %f382, %f348, %f281; - fma.rn.ftz.f32 %f283, %f381, %f349, %f282; - fma.rn.ftz.f32 %f284, %f380, %f350, %f283; - fma.rn.ftz.f32 %f285, %f379, %f383, %f284; - st.global.f32 [%r68+20480], %f285; - ld.global.f32 %f286, [%r67]; - mul.ftz.f32 %f287, %f369, %f286; - fma.rn.ftz.f32 %f288, %f370, %f385, %f287; - fma.rn.ftz.f32 %f289, %f368, %f323, %f288; - fma.rn.ftz.f32 %f290, %f367, %f324, %f289; - fma.rn.ftz.f32 %f291, %f374, %f325, %f290; - fma.rn.ftz.f32 %f292, %f373, %f326, %f291; - fma.rn.ftz.f32 %f293, %f372, %f335, %f292; - fma.rn.ftz.f32 %f294, %f371, %f336, %f293; - fma.rn.ftz.f32 %f295, %f378, %f337, %f294; - fma.rn.ftz.f32 %f296, %f377, %f338, %f295; - fma.rn.ftz.f32 %f297, %f376, %f347, %f296; - fma.rn.ftz.f32 %f298, %f375, %f348, %f297; - fma.rn.ftz.f32 %f299, %f382, %f349, %f298; - fma.rn.ftz.f32 %f300, %f381, %f350, %f299; - fma.rn.ftz.f32 %f301, %f380, %f383, %f300; - fma.rn.ftz.f32 %f302, %f379, %f384, %f301; - st.global.f32 [%r68+24576], %f302; - mul.ftz.f32 %f303, %f369, %f323; - fma.rn.ftz.f32 %f304, %f370, %f286, %f303; - fma.rn.ftz.f32 %f305, %f368, %f324, %f304; - fma.rn.ftz.f32 %f306, %f367, %f325, %f305; - fma.rn.ftz.f32 %f307, %f374, %f326, %f306; - fma.rn.ftz.f32 %f308, %f373, %f335, %f307; - fma.rn.ftz.f32 %f309, %f372, %f336, %f308; - fma.rn.ftz.f32 %f310, %f371, %f337, %f309; - fma.rn.ftz.f32 %f311, %f378, %f338, %f310; - fma.rn.ftz.f32 %f312, %f377, %f347, %f311; - fma.rn.ftz.f32 %f313, %f376, %f348, %f312; - fma.rn.ftz.f32 %f314, %f375, %f349, %f313; - fma.rn.ftz.f32 %f315, %f382, %f350, %f314; - fma.rn.ftz.f32 %f316, %f381, %f383, %f315; - fma.rn.ftz.f32 %f317, %f380, %f384, %f316; - fma.rn.ftz.f32 %f318, %f379, %f385, %f317; - st.global.f32 [%r68+28672], %f318; - add.s32 %r70, %r70, 65536; - add.s32 %r69, %r69, -1; - setp.ne.s32 %p1, %r69, 0; - mov.f32 %f383, %f383; - mov.f32 %f384, %f384; - mov.f32 %f385, %f385; - mov.f32 %f366, %f286; - @%p1 bra BB0_1; - - ret; -} - - diff --git a/RTCP/GPUProc/src/UHEP/Transpose.cl-0.ptx b/RTCP/GPUProc/src/UHEP/Transpose.cl-0.ptx deleted file mode 100644 index cb8248be325..00000000000 --- a/RTCP/GPUProc/src/UHEP/Transpose.cl-0.ptx +++ /dev/null @@ -1,142 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Tue Feb 7 07:15:59 2012 (1328595359) -// Driver 295.20 -// - -.version 3.0 -.target sm_21, texmode_independent -.address_size 32 - -.extern .shared .align 16 .b8 shr_1_tmp[4352]; - -.entry UHEP_Transpose( - .param .u32 .ptr .global .align 1 UHEP_Transpose_param_0, - .param .u32 .ptr .global .align 1 UHEP_Transpose_param_1, - .param .u32 .ptr .global .align 4 UHEP_Transpose_param_2 -) -{ - .reg .f32 %f<30>; - .reg .pred %p<7>; - .reg .s32 %r<61>; - - - ld.param.u32 %r25, [UHEP_Transpose_param_0]; - ld.param.u32 %r26, [UHEP_Transpose_param_1]; - ld.param.u32 %r27, [UHEP_Transpose_param_2]; - // inline asm - mov.u32 %r12, %envreg4; - // inline asm - // inline asm - mov.u32 %r13, %ntid.y; - // inline asm - // inline asm - mov.u32 %r14, %ctaid.y; - // inline asm - // inline asm - mov.u32 %r15, %tid.y; - // inline asm - add.s32 %r28, %r15, %r12; - mad.lo.s32 %r29, %r14, %r13, %r28; - // inline asm - mov.u32 %r16, %envreg5; - // inline asm - // inline asm - mov.u32 %r17, %ntid.z; - // inline asm - // inline asm - mov.u32 %r18, %ctaid.z; - // inline asm - // inline asm - mov.u32 %r19, %tid.z; - // inline asm - add.s32 %r30, %r19, %r16; - mad.lo.s32 %r31, %r18, %r17, %r30; - // inline asm - mov.u32 %r20, %tid.x; - // inline asm - shl.b32 %r32, %r29, 4; - and.b32 %r33, %r20, 15; - add.s32 %r34, %r32, %r33; - // inline asm - mov.u32 %r21, %tid.x; - // inline asm - shr.u32 %r35, %r21, 4; - shl.b32 %r36, %r31, 4; - add.s32 %r37, %r36, %r35; - shl.b32 %r38, %r37, 2; - add.s32 %r39, %r27, %r38; - setp.lt.u32 %p4, %r34, 4; - ld.global.u32 %r40, [%r39]; - setp.gt.s32 %p5, %r40, -1; - and.pred %p1, %p4, %p5; - // inline asm - mov.u32 %r22, %tid.x; - // inline asm - shr.u32 %r41, %r22, 4; - // inline asm - mov.u32 %r23, %tid.x; - // inline asm - and.b32 %r42, %r23, 15; - add.s32 %r43, %r36, %r42; - shl.b32 %r44, %r43, 2; - add.s32 %r45, %r27, %r44; - add.s32 %r46, %r41, %r32; - setp.lt.u32 %p2, %r46, 4; - mov.u32 %r47, shr_1_tmp; - mad.lo.s32 %r48, %r33, 272, %r47; - and.b32 %r49, %r21, -16; - add.s32 %r1, %r48, %r49; - ld.global.u32 %r50, [%r45]; - setp.gt.s32 %p3, %r50, -1; - mad.lo.s32 %r51, %r41, 272, %r47; - shl.b32 %r52, %r42, 4; - add.s32 %r2, %r51, %r52; - shl.b32 %r53, %r43, 3; - mad.lo.s32 %r54, %r46, 8511488, %r53; - add.s32 %r55, %r54, %r25; - add.s32 %r60, %r55, 4255744; - shl.b32 %r56, %r34, 4; - mad.lo.s32 %r57, %r40, 66496, %r56; - add.s32 %r59, %r26, %r57; - mov.u32 %r58, 1039; - -BB0_1: - add.s32 %r8, %r60, -4255744; - @!%p1 bra BB0_3; - - ld.global.v4.f32 {%f22, %f23, %f24, %f25}, [%r59]; - st.shared.v4.f32 [%r1], {%f22, %f23, %f24, %f25}; - -BB0_3: - bar.sync 0; - @!%p2 bra BB0_8; - - @%p3 bra BB0_6; - - mov.f32 %f1, 0f00000000; - mov.f32 %f26, %f1; - mov.f32 %f27, %f1; - mov.f32 %f28, %f1; - mov.f32 %f29, %f1; - bra.uni BB0_7; - -BB0_6: - ld.shared.v4.f32 {%f26, %f27, %f28, %f29}, [%r2]; - -BB0_7: - st.global.v2.f32 [%r8], {%f26, %f27}; - st.global.v2.f32 [%r8+4255744], {%f28, %f29}; - -BB0_8: - bar.sync 0; - add.s32 %r60, %r60, 4096; - add.s32 %r59, %r59, 64; - add.s32 %r58, %r58, -1; - setp.ne.s32 %p6, %r58, 0; - @%p6 bra BB0_1; - - ret; -} - - diff --git a/RTCP/GPUProc/src/UHEP/Trigger.cl-0.ptx b/RTCP/GPUProc/src/UHEP/Trigger.cl-0.ptx deleted file mode 100644 index ae2713f9037..00000000000 --- a/RTCP/GPUProc/src/UHEP/Trigger.cl-0.ptx +++ /dev/null @@ -1,511 +0,0 @@ -// -// Generated by NVIDIA NVVM Compiler -// Compiler built on Tue Feb 7 07:15:59 2012 (1328595359) -// Driver 295.20 -// - -.version 3.0 -.target sm_21, texmode_independent -.address_size 32 - -.extern .shared .align 64 .b8 shr_4_tmp[16384]; - -.entry trigger( - .param .u32 .ptr .global .align 1 trigger_param_0, - .param .u32 .ptr .global .align 4 trigger_param_1 -) -{ - .reg .f32 %f<434>; - .reg .pred %p<21>; - .reg .s32 %r<71>; - - - ld.param.u32 %r31, [trigger_param_1]; - // inline asm - mov.u32 %r23, %tid.x; - // inline asm - // inline asm - mov.u32 %r24, %tid.y; - // inline asm - shl.b32 %r32, %r24, 4; - // inline asm - mov.u32 %r25, %envreg5; - // inline asm - // inline asm - mov.u32 %r26, %ntid.z; - // inline asm - // inline asm - mov.u32 %r27, %ctaid.z; - // inline asm - // inline asm - mov.u32 %r28, %tid.z; - // inline asm - add.s32 %r33, %r28, %r25; - mad.lo.s32 %r3, %r27, %r26, %r33; - shl.b32 %r34, %r24, 10; - mov.u32 %r35, shr_4_tmp; - add.s32 %r36, %r35, %r34; - shl.b32 %r37, %r23, 6; - add.s32 %r4, %r36, %r37; - add.s32 %r2, %r32, %r23; - shl.b32 %r38, %r2, 12; - and.b32 %r5, %r38, 16773120; - shl.b32 %r39, %r3, 21; - add.s32 %r40, %r23, %r39; - shl.b32 %r41, %r24, 12; - add.s32 %r42, %r40, %r41; - shl.b32 %r43, %r42, 2; - add.s32 %r70, %r31, %r43; - shl.b32 %r44, %r24, 6; - shl.b32 %r45, %r23, 2; - add.s32 %r46, %r35, %r44; - add.s32 %r47, %r46, %r45; - add.s32 %r7, %r47, 3072; - mov.f32 %f420, 0f00000000; - mov.f32 %f430, %f420; - mov.f32 %f431, %f420; - mov.f32 %f432, %f420; - mov.f32 %f433, %f420; - mov.f32 %f422, %f405; - mov.f32 %f419, %f420; - mov.f32 %f421, %f420; - mov.f32 %f418, %f420; - mov.u32 %r65, 0; - mov.u32 %r64, %r65; - mov.f32 %f426, %f420; - mov.f32 %f427, %f420; - mov.f32 %f428, %f420; - mov.f32 %f429, %f420; - mov.f32 %f423, %f420; - mov.f32 %f424, %f420; - mov.f32 %f425, %f420; - -BB0_1: - mov.u32 %r68, %r70; - mov.u32 %r8, %r68; - shl.b32 %r49, %r64, 4; - add.s32 %r12, %r5, %r49; - mov.u32 %r67, 16; - mov.u32 %r66, %r7; - mov.u32 %r69, %r8; - -BB0_2: - mov.u32 %r15, %r69; - ld.global.f32 %f40, [%r15]; - ld.global.f32 %f41, [%r15+4194304]; - mul.ftz.f32 %f42, %f41, %f41; - fma.rn.ftz.f32 %f43, %f40, %f40, %f42; - st.shared.f32 [%r66+-3072], %f43; - sub.ftz.f32 %f44, %f43, %f419; - add.ftz.f32 %f45, %f421, 0f3F800000; - div.approx.ftz.f32 %f46, %f44, %f45; - add.ftz.f32 %f47, %f419, %f46; - sub.ftz.f32 %f48, %f43, %f47; - fma.rn.ftz.f32 %f49, %f44, %f48, %f420; - ld.global.f32 %f50, [%r15+262144]; - ld.global.f32 %f51, [%r15+4456448]; - mul.ftz.f32 %f52, %f51, %f51; - fma.rn.ftz.f32 %f53, %f50, %f50, %f52; - st.shared.f32 [%r66+-2048], %f53; - add.ftz.f32 %f54, %f45, 0f3F800000; - sub.ftz.f32 %f55, %f53, %f47; - div.approx.ftz.f32 %f56, %f55, %f54; - add.ftz.f32 %f57, %f47, %f56; - sub.ftz.f32 %f58, %f53, %f57; - fma.rn.ftz.f32 %f59, %f55, %f58, %f49; - ld.global.f32 %f60, [%r15+524288]; - ld.global.f32 %f61, [%r15+4718592]; - mul.ftz.f32 %f62, %f61, %f61; - fma.rn.ftz.f32 %f63, %f60, %f60, %f62; - st.shared.f32 [%r66+-1024], %f63; - add.ftz.f32 %f64, %f54, 0f3F800000; - sub.ftz.f32 %f65, %f63, %f57; - div.approx.ftz.f32 %f66, %f65, %f64; - add.ftz.f32 %f67, %f57, %f66; - sub.ftz.f32 %f68, %f63, %f67; - fma.rn.ftz.f32 %f69, %f65, %f68, %f59; - ld.global.f32 %f70, [%r15+786432]; - ld.global.f32 %f71, [%r15+4980736]; - mul.ftz.f32 %f72, %f71, %f71; - fma.rn.ftz.f32 %f73, %f70, %f70, %f72; - st.shared.f32 [%r66], %f73; - add.ftz.f32 %f421, %f64, 0f3F800000; - sub.ftz.f32 %f74, %f73, %f67; - div.approx.ftz.f32 %f75, %f74, %f421; - add.ftz.f32 %f419, %f67, %f75; - sub.ftz.f32 %f76, %f73, %f419; - fma.rn.ftz.f32 %f420, %f74, %f76, %f69; - add.s32 %r16, %r15, 1048576; - add.s32 %r66, %r66, 4096; - add.s32 %r67, %r67, -4; - setp.ne.s32 %p1, %r67, 0; - mov.u32 %r69, %r16; - @%p1 bra BB0_2; - - bar.sync 0; - ld.shared.v4.f32 {%f258, %f259, %f260, %f261}, [%r4]; - add.ftz.f32 %f79, %f422, %f258; - sub.ftz.f32 %f81, %f79, %f423; - add.ftz.f32 %f83, %f81, %f259; - sub.ftz.f32 %f85, %f83, %f424; - add.ftz.f32 %f87, %f85, %f260; - sub.ftz.f32 %f89, %f87, %f425; - add.ftz.f32 %f91, %f89, %f261; - sub.ftz.f32 %f93, %f91, %f426; - ld.shared.v4.f32 {%f274, %f423, %f424, %f425}, [%r4+16]; - add.ftz.f32 %f95, %f93, %f274; - sub.ftz.f32 %f97, %f95, %f427; - add.ftz.f32 %f99, %f97, %f423; - sub.ftz.f32 %f101, %f99, %f428; - add.ftz.f32 %f103, %f101, %f424; - sub.ftz.f32 %f105, %f103, %f429; - add.ftz.f32 %f107, %f105, %f425; - sub.ftz.f32 %f109, %f107, %f430; - ld.shared.v4.f32 {%f426, %f427, %f428, %f429}, [%r4+32]; - add.ftz.f32 %f111, %f109, %f426; - sub.ftz.f32 %f113, %f111, %f431; - add.ftz.f32 %f115, %f113, %f427; - sub.ftz.f32 %f117, %f115, %f432; - add.ftz.f32 %f119, %f117, %f428; - sub.ftz.f32 %f121, %f119, %f433; - add.ftz.f32 %f123, %f121, %f429; - sub.ftz.f32 %f124, %f123, %f258; - ld.shared.v4.f32 {%f430, %f431, %f432, %f433}, [%r4+48]; - add.ftz.f32 %f126, %f124, %f430; - sub.ftz.f32 %f127, %f126, %f259; - add.ftz.f32 %f129, %f127, %f431; - sub.ftz.f32 %f130, %f129, %f260; - add.ftz.f32 %f132, %f130, %f432; - sub.ftz.f32 %f133, %f132, %f261; - add.ftz.f32 %f135, %f133, %f433; - sub.ftz.f32 %f136, %f135, %f274; - max.f32 %f137, %f81, %f85; - max.f32 %f138, %f89, %f93; - max.f32 %f139, %f137, %f138; - max.f32 %f140, %f97, %f101; - max.f32 %f141, %f105, %f109; - max.f32 %f142, %f140, %f141; - max.f32 %f143, %f113, %f117; - max.f32 %f144, %f121, %f124; - max.f32 %f145, %f143, %f144; - max.f32 %f146, %f127, %f130; - max.f32 %f147, %f133, %f136; - max.f32 %f148, %f146, %f147; - max.f32 %f149, %f139, %f142; - max.f32 %f150, %f145, %f148; - max.f32 %f151, %f149, %f150; - setp.ltu.ftz.f32 %p2, %f151, %f418; - selp.f32 %f418, %f418, %f151, %p2; - selp.b32 %r65, %r65, %r12, %p2; - mov.f32 %f306, %f81; - mov.f32 %f307, %f85; - mov.f32 %f308, %f89; - mov.f32 %f309, %f93; - mov.f32 %f326, %f97; - mov.f32 %f327, %f101; - mov.f32 %f328, %f105; - mov.f32 %f329, %f109; - mov.f32 %f346, %f113; - mov.f32 %f347, %f117; - mov.f32 %f348, %f121; - mov.f32 %f349, %f124; - mov.f32 %f362, %f127; - mov.f32 %f363, %f130; - mov.f32 %f364, %f133; - mov.f32 %f422, %f136; - bar.sync 0; - add.s32 %r64, %r64, 1; - add.s32 %r21, %r8, 64; - setp.ne.s32 %p3, %r64, 256; - mov.u32 %r70, %r21; - @%p3 bra BB0_1; - - shl.b32 %r50, %r2, 2; - add.s32 %r22, %r35, %r50; - st.shared.f32 [%r22], %f419; - st.shared.f32 [%r22+1024], %f420; - st.shared.f32 [%r22+2048], %f418; - st.shared.u32 [%r22+3072], %r65; - setp.lt.u32 %p4, %r2, 128; - @%p4 bra BB0_5; - bra.uni BB0_7; - -BB0_5: - ld.shared.f32 %f152, [%r22+1536]; - ld.shared.f32 %f153, [%r22+512]; - sub.ftz.f32 %f154, %f153, %f419; - add.ftz.f32 %f155, %f419, %f153; - div.rn.ftz.f32 %f156, %f155, 0f40000000; - st.shared.f32 [%r22], %f156; - add.ftz.f32 %f157, %f420, %f152; - mul.ftz.f32 %f158, %f154, %f154; - mul.ftz.f32 %f159, %f158, %f421; - div.rn.ftz.f32 %f160, %f159, 0f40000000; - add.ftz.f32 %f161, %f157, %f160; - st.shared.f32 [%r22+1024], %f161; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f13, [%r22+2560]; - setp.lt.ftz.f32 %p5, %f418, %f13; - @%p5 bra BB0_6; - bra.uni BB0_7; - -BB0_6: - st.shared.f32 [%r22+2048], %f13; - ld.shared.u32 %r52, [%r22+3584]; - st.shared.u32 [%r22+3072], %r52; - -BB0_7: - bar.sync 0; - setp.lt.u32 %p6, %r2, 64; - @%p6 bra BB0_8; - bra.uni BB0_10; - -BB0_8: - ld.shared.f32 %f162, [%r22]; - ld.shared.f32 %f163, [%r22+1024]; - ld.shared.f32 %f164, [%r22+1280]; - ld.shared.f32 %f165, [%r22+256]; - sub.ftz.f32 %f166, %f165, %f162; - add.ftz.f32 %f167, %f162, %f165; - div.rn.ftz.f32 %f168, %f167, 0f40000000; - st.shared.f32 [%r22], %f168; - add.ftz.f32 %f169, %f163, %f164; - mul.ftz.f32 %f170, %f166, %f166; - mul.ftz.f32 %f171, %f170, %f421; - div.rn.ftz.f32 %f172, %f171, 0f40000000; - add.ftz.f32 %f173, %f169, %f172; - st.shared.f32 [%r22+1024], %f173; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f16, [%r22+2304]; - ld.shared.f32 %f174, [%r22+2048]; - setp.lt.ftz.f32 %p7, %f174, %f16; - @%p7 bra BB0_9; - bra.uni BB0_10; - -BB0_9: - st.shared.f32 [%r22+2048], %f16; - ld.shared.u32 %r53, [%r22+3328]; - st.shared.u32 [%r22+3072], %r53; - -BB0_10: - bar.sync 0; - setp.lt.u32 %p8, %r2, 32; - @%p8 bra BB0_11; - bra.uni BB0_13; - -BB0_11: - ld.shared.f32 %f175, [%r22]; - ld.shared.f32 %f176, [%r22+1024]; - ld.shared.f32 %f177, [%r22+1152]; - ld.shared.f32 %f178, [%r22+128]; - sub.ftz.f32 %f179, %f178, %f175; - add.ftz.f32 %f180, %f175, %f178; - div.rn.ftz.f32 %f181, %f180, 0f40000000; - st.shared.f32 [%r22], %f181; - add.ftz.f32 %f182, %f176, %f177; - mul.ftz.f32 %f183, %f179, %f179; - mul.ftz.f32 %f184, %f183, %f421; - div.rn.ftz.f32 %f185, %f184, 0f40000000; - add.ftz.f32 %f186, %f182, %f185; - st.shared.f32 [%r22+1024], %f186; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f19, [%r22+2176]; - ld.shared.f32 %f187, [%r22+2048]; - setp.lt.ftz.f32 %p9, %f187, %f19; - @%p9 bra BB0_12; - bra.uni BB0_13; - -BB0_12: - st.shared.f32 [%r22+2048], %f19; - ld.shared.u32 %r54, [%r22+3200]; - st.shared.u32 [%r22+3072], %r54; - -BB0_13: - bar.sync 0; - setp.lt.u32 %p10, %r2, 16; - @%p10 bra BB0_14; - bra.uni BB0_16; - -BB0_14: - ld.shared.f32 %f188, [%r22]; - ld.shared.f32 %f189, [%r22+1024]; - ld.shared.f32 %f190, [%r22+1088]; - ld.shared.f32 %f191, [%r22+64]; - sub.ftz.f32 %f192, %f191, %f188; - add.ftz.f32 %f193, %f188, %f191; - div.rn.ftz.f32 %f194, %f193, 0f40000000; - st.shared.f32 [%r22], %f194; - add.ftz.f32 %f195, %f189, %f190; - mul.ftz.f32 %f196, %f192, %f192; - mul.ftz.f32 %f197, %f196, %f421; - div.rn.ftz.f32 %f198, %f197, 0f40000000; - add.ftz.f32 %f199, %f195, %f198; - st.shared.f32 [%r22+1024], %f199; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f22, [%r22+2112]; - ld.shared.f32 %f200, [%r22+2048]; - setp.lt.ftz.f32 %p11, %f200, %f22; - @%p11 bra BB0_15; - bra.uni BB0_16; - -BB0_15: - st.shared.f32 [%r22+2048], %f22; - ld.shared.u32 %r55, [%r22+3136]; - st.shared.u32 [%r22+3072], %r55; - -BB0_16: - bar.sync 0; - setp.lt.u32 %p12, %r2, 8; - @%p12 bra BB0_17; - bra.uni BB0_19; - -BB0_17: - ld.shared.f32 %f201, [%r22]; - ld.shared.f32 %f202, [%r22+1024]; - ld.shared.f32 %f203, [%r22+1056]; - ld.shared.f32 %f204, [%r22+32]; - sub.ftz.f32 %f205, %f204, %f201; - add.ftz.f32 %f206, %f201, %f204; - div.rn.ftz.f32 %f207, %f206, 0f40000000; - st.shared.f32 [%r22], %f207; - add.ftz.f32 %f208, %f202, %f203; - mul.ftz.f32 %f209, %f205, %f205; - mul.ftz.f32 %f210, %f209, %f421; - div.rn.ftz.f32 %f211, %f210, 0f40000000; - add.ftz.f32 %f212, %f208, %f211; - st.shared.f32 [%r22+1024], %f212; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f25, [%r22+2080]; - ld.shared.f32 %f213, [%r22+2048]; - setp.lt.ftz.f32 %p13, %f213, %f25; - @%p13 bra BB0_18; - bra.uni BB0_19; - -BB0_18: - st.shared.f32 [%r22+2048], %f25; - ld.shared.u32 %r56, [%r22+3104]; - st.shared.u32 [%r22+3072], %r56; - -BB0_19: - bar.sync 0; - setp.lt.u32 %p14, %r2, 4; - @%p14 bra BB0_20; - bra.uni BB0_22; - -BB0_20: - ld.shared.f32 %f214, [%r22]; - ld.shared.f32 %f215, [%r22+1024]; - ld.shared.f32 %f216, [%r22+1040]; - ld.shared.f32 %f217, [%r22+16]; - sub.ftz.f32 %f218, %f217, %f214; - add.ftz.f32 %f219, %f214, %f217; - div.rn.ftz.f32 %f220, %f219, 0f40000000; - st.shared.f32 [%r22], %f220; - add.ftz.f32 %f221, %f215, %f216; - mul.ftz.f32 %f222, %f218, %f218; - mul.ftz.f32 %f223, %f222, %f421; - div.rn.ftz.f32 %f224, %f223, 0f40000000; - add.ftz.f32 %f225, %f221, %f224; - st.shared.f32 [%r22+1024], %f225; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f28, [%r22+2064]; - ld.shared.f32 %f226, [%r22+2048]; - setp.lt.ftz.f32 %p15, %f226, %f28; - @%p15 bra BB0_21; - bra.uni BB0_22; - -BB0_21: - st.shared.f32 [%r22+2048], %f28; - ld.shared.u32 %r57, [%r22+3088]; - st.shared.u32 [%r22+3072], %r57; - -BB0_22: - bar.sync 0; - setp.lt.u32 %p16, %r2, 2; - @%p16 bra BB0_23; - bra.uni BB0_25; - -BB0_23: - ld.shared.f32 %f227, [%r22]; - ld.shared.f32 %f228, [%r22+1024]; - ld.shared.f32 %f229, [%r22+1032]; - ld.shared.f32 %f230, [%r22+8]; - sub.ftz.f32 %f231, %f230, %f227; - add.ftz.f32 %f232, %f227, %f230; - div.rn.ftz.f32 %f233, %f232, 0f40000000; - st.shared.f32 [%r22], %f233; - add.ftz.f32 %f234, %f228, %f229; - mul.ftz.f32 %f235, %f231, %f231; - mul.ftz.f32 %f236, %f235, %f421; - div.rn.ftz.f32 %f237, %f236, 0f40000000; - add.ftz.f32 %f238, %f234, %f237; - st.shared.f32 [%r22+1024], %f238; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f31, [%r22+2056]; - ld.shared.f32 %f239, [%r22+2048]; - setp.lt.ftz.f32 %p17, %f239, %f31; - @%p17 bra BB0_24; - bra.uni BB0_25; - -BB0_24: - st.shared.f32 [%r22+2048], %f31; - ld.shared.u32 %r58, [%r22+3080]; - st.shared.u32 [%r22+3072], %r58; - -BB0_25: - bar.sync 0; - setp.eq.s32 %p18, %r2, 0; - @%p18 bra BB0_26; - bra.uni BB0_28; - -BB0_26: - ld.shared.f32 %f240, [%r22]; - ld.shared.f32 %f241, [%r22+1024]; - ld.shared.f32 %f242, [%r22+1028]; - ld.shared.f32 %f243, [%r22+4]; - sub.ftz.f32 %f244, %f243, %f240; - add.ftz.f32 %f245, %f240, %f243; - div.rn.ftz.f32 %f246, %f245, 0f40000000; - st.shared.f32 [%r22], %f246; - add.ftz.f32 %f247, %f241, %f242; - mul.ftz.f32 %f248, %f244, %f244; - mul.ftz.f32 %f249, %f248, %f421; - div.rn.ftz.f32 %f250, %f249, 0f40000000; - add.ftz.f32 %f251, %f247, %f250; - st.shared.f32 [%r22+1024], %f251; - add.ftz.f32 %f421, %f421, %f421; - ld.shared.f32 %f34, [%r22+2052]; - ld.shared.f32 %f252, [%r22+2048]; - setp.lt.ftz.f32 %p19, %f252, %f34; - @%p19 bra BB0_27; - bra.uni BB0_28; - -BB0_27: - st.shared.f32 [%r22+2048], %f34; - ld.shared.u32 %r59, [%r22+3076]; - st.shared.u32 [%r22+3072], %r59; - -BB0_28: - bar.sync 0; - @%p18 bra BB0_30; - - ret; - -BB0_30: - shl.b32 %r60, %r3, 4; - ld.param.u32 %r63, [trigger_param_0]; - add.s32 %r61, %r63, %r60; - ld.shared.f32 %f253, [shr_4_tmp]; - st.global.f32 [%r61], %f253; - add.ftz.f32 %f254, %f421, 0fBF800000; - ld.shared.f32 %f255, [shr_4_tmp+1024]; - div.approx.ftz.f32 %f256, %f255, %f254; - st.global.f32 [%r61+4], %f256; - ld.shared.f32 %f257, [shr_4_tmp+2048]; - st.global.f32 [%r61+8], %f257; - ld.shared.u32 %r62, [shr_4_tmp+3072]; - st.global.u32 [%r61+12], %r62; - ret; -} - - diff --git a/RTCP/GPUProc/src/octave-core b/RTCP/GPUProc/src/octave-core deleted file mode 100644 index 608aba01c896492a0c4befa1f98dc1416cc6cf6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeZIE=ep))iu=hVc=k3V9?7;EK1MJ(*rUY82+;XiQ?qMoWvq_umF%?2I9oLVlekV ZACOAU&n?JFtx!N#*Wl~`R=~h;007lH6G;F7 -- GitLab