Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

116 rindas
3.5KB

  1. //go:build cufft && windows
  2. package gpudemod
  3. /*
  4. #cgo windows CFLAGS: -I"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v13.2/include"
  5. #include <cuda_runtime.h>
  6. typedef struct { float x; float y; } gpud_float2;
  7. */
  8. import "C"
  9. import (
  10. "math"
  11. "unsafe"
  12. )
  13. func (r *BatchRunner) executeStreamingGPUNativePrepared(invocations []StreamingGPUInvocation) ([]StreamingGPUExecutionResult, error) {
  14. results := make([]StreamingGPUExecutionResult, len(invocations))
  15. for i, inv := range invocations {
  16. phaseInc := -2.0 * math.Pi * inv.OffsetHz / float64(inv.SampleRate)
  17. outCap := len(inv.IQNew)/maxInt(1, inv.Decim) + 2
  18. outHost := make([]complex64, outCap)
  19. histCap := maxInt(0, inv.NumTaps-1)
  20. histHost := make([]complex64, histCap)
  21. var nOut C.int
  22. var phaseCountOut C.int
  23. var phaseEndOut C.double
  24. var dInNew, dHistIn, dOut, dHistOut unsafe.Pointer
  25. var dTaps unsafe.Pointer
  26. if len(inv.IQNew) > 0 {
  27. if bridgeCudaMalloc(&dInNew, uintptr(len(inv.IQNew))*unsafe.Sizeof(C.gpud_float2{})) != 0 {
  28. return nil, ErrUnavailable
  29. }
  30. defer bridgeCudaFree(dInNew)
  31. if bridgeMemcpyH2D(dInNew, unsafe.Pointer(&inv.IQNew[0]), uintptr(len(inv.IQNew))*unsafe.Sizeof(complex64(0))) != 0 {
  32. return nil, ErrUnavailable
  33. }
  34. }
  35. if len(inv.ShiftedHistory) > 0 {
  36. if bridgeCudaMalloc(&dHistIn, uintptr(len(inv.ShiftedHistory))*unsafe.Sizeof(C.gpud_float2{})) != 0 {
  37. return nil, ErrUnavailable
  38. }
  39. defer bridgeCudaFree(dHistIn)
  40. if bridgeMemcpyH2D(dHistIn, unsafe.Pointer(&inv.ShiftedHistory[0]), uintptr(len(inv.ShiftedHistory))*unsafe.Sizeof(complex64(0))) != 0 {
  41. return nil, ErrUnavailable
  42. }
  43. }
  44. if len(inv.PolyphaseTaps) > 0 {
  45. if bridgeCudaMalloc(&dTaps, uintptr(len(inv.PolyphaseTaps))*unsafe.Sizeof(C.float(0))) != 0 {
  46. return nil, ErrUnavailable
  47. }
  48. defer bridgeCudaFree(dTaps)
  49. if bridgeMemcpyH2D(dTaps, unsafe.Pointer(&inv.PolyphaseTaps[0]), uintptr(len(inv.PolyphaseTaps))*unsafe.Sizeof(float32(0))) != 0 {
  50. return nil, ErrUnavailable
  51. }
  52. }
  53. if outCap > 0 {
  54. if bridgeCudaMalloc(&dOut, uintptr(outCap)*unsafe.Sizeof(C.gpud_float2{})) != 0 {
  55. return nil, ErrUnavailable
  56. }
  57. defer bridgeCudaFree(dOut)
  58. }
  59. if histCap > 0 {
  60. if bridgeCudaMalloc(&dHistOut, uintptr(histCap)*unsafe.Sizeof(C.gpud_float2{})) != 0 {
  61. return nil, ErrUnavailable
  62. }
  63. defer bridgeCudaFree(dHistOut)
  64. }
  65. res := bridgeLaunchStreamingPolyphasePrepare(
  66. (*C.gpud_float2)(dInNew),
  67. len(inv.IQNew),
  68. (*C.gpud_float2)(dHistIn),
  69. len(inv.ShiftedHistory),
  70. (*C.float)(dTaps),
  71. len(inv.PolyphaseTaps),
  72. inv.Decim,
  73. inv.NumTaps,
  74. inv.PhaseCountIn,
  75. inv.NCOPhaseIn,
  76. phaseInc,
  77. (*C.gpud_float2)(dOut),
  78. &nOut,
  79. &phaseCountOut,
  80. &phaseEndOut,
  81. (*C.gpud_float2)(dHistOut),
  82. )
  83. if res != 0 {
  84. return nil, ErrUnavailable
  85. }
  86. if int(nOut) > 0 {
  87. if bridgeMemcpyD2H(unsafe.Pointer(&outHost[0]), dOut, uintptr(int(nOut))*unsafe.Sizeof(complex64(0))) != 0 {
  88. return nil, ErrUnavailable
  89. }
  90. }
  91. if histCap > 0 {
  92. if bridgeMemcpyD2H(unsafe.Pointer(&histHost[0]), dHistOut, uintptr(histCap)*unsafe.Sizeof(complex64(0))) != 0 {
  93. return nil, ErrUnavailable
  94. }
  95. }
  96. results[i] = StreamingGPUExecutionResult{
  97. SignalID: inv.SignalID,
  98. Mode: StreamingGPUExecCUDA,
  99. IQ: append([]complex64(nil), outHost[:int(nOut)]...),
  100. Rate: inv.OutRate,
  101. NOut: int(nOut),
  102. PhaseCountOut: int(phaseCountOut),
  103. NCOPhaseOut: float64(phaseEndOut),
  104. HistoryOut: append([]complex64(nil), histHost...),
  105. HistoryLenOut: histCap,
  106. }
  107. }
  108. return results, nil
  109. }