Skip to content

Commit 26c9fd3

Browse files
committed
Updated to latest scopehal. Updated unit tests with noisy sine to handle new API. Loosened absolute accuracy tolerances for noisy sine, but tightened tolerance for CPU-GPU match
1 parent 93a8f0e commit 26c9fd3

5 files changed

Lines changed: 50 additions & 34 deletions

File tree

tests/Filters/Filter_ACRMS.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,11 @@ TEST_CASE("Filter_ACRMS")
8181
const size_t depth = 50000000;
8282

8383
//Input waveforms
84-
auto wfm = dynamic_cast<UniformAnalogWaveform*>(
85-
source.GenerateNoisySinewave(1.0, 0.5, 200000, 20000, depth, 0.0));
84+
UniformAnalogWaveform* wfm = new UniformAnalogWaveform;
85+
source.GenerateNoisySinewave(cmdbuf, queue, wfm, 1.0, 0.5, 200000, 20000, depth, 0.0);
8686

8787
//Add a small DC offset to make sure we null it out right
88+
wfm->PrepareForCpuAccess();
8889
float offset = 0.314159;
8990
for(size_t i=0; i<depth; i++)
9091
wfm->m_samples[i] += offset;
@@ -121,10 +122,14 @@ TEST_CASE("Filter_ACRMS")
121122
double dt = GetTime() - start;
122123
LogVerbose("GPU: %.2f ms, RMS = %f, %.2fx speedup\n", dt * 1000, gpurms, tbase / dt);
123124

124-
//Verify the overall results
125-
const float epsilon = 0.001;
126-
REQUIRE(fabs(cpurms - 0.353553) < epsilon);
127-
REQUIRE(fabs(gpurms - 0.353553) < epsilon);
125+
//Verify the overall results are roughly in the right ballpark (randomness means it won't be perfect)
126+
const float epsilon1 = 0.04;
127+
REQUIRE(fabs(cpurms - 0.353553) < epsilon1);
128+
REQUIRE(fabs(gpurms - 0.353553) < epsilon1);
129+
130+
//and that CPU and GPU match
131+
const float epsilon3 = 0.0001;
132+
REQUIRE(fabs(cpurms - gpurms) < epsilon3);
128133

129134
//Verify the cycle-by-cycle results
130135
//TODO: why do we occasionally get spikes of larger deltas? smaller epsilon should be achievable

tests/Filters/FrequencyMeasurement.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* *
33
* ngscopeclient *
44
* *
5-
* Copyright (c) 2012-2024 Andrew D. Zonenberg and contributors *
5+
* Copyright (c) 2012-2025 Andrew D. Zonenberg and contributors *
66
* All rights reserved. *
77
* *
88
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the *
@@ -52,6 +52,16 @@ TEST_CASE("Filter_FrequencyMeasurement")
5252
REQUIRE(filter != nullptr);
5353
filter->AddRef();
5454

55+
//Create a queue and command buffer
56+
shared_ptr<QueueHandle> queue(g_vkQueueManager->GetComputeQueue("Primitive_FindZeroCrossings.queue"));
57+
vk::CommandPoolCreateInfo poolInfo(
58+
vk::CommandPoolCreateFlagBits::eTransient | vk::CommandPoolCreateFlagBits::eResetCommandBuffer,
59+
queue->m_family );
60+
vk::raii::CommandPool pool(*g_vkComputeDevice, poolInfo);
61+
62+
vk::CommandBufferAllocateInfo bufinfo(*pool, vk::CommandBufferLevel::ePrimary, 1);
63+
vk::raii::CommandBuffer cmdBuf(std::move(vk::raii::CommandBuffers(*g_vkComputeDevice, bufinfo).front()));
64+
5565
const size_t niter = 25;
5666
for(size_t i=0; i<niter; i++)
5767
{
@@ -70,9 +80,10 @@ TEST_CASE("Filter_FrequencyMeasurement")
7080

7181
//Generate the input signal.
7282
//50 Gsps, 100K points, no added noise
73-
g_scope->GetOscilloscopeChannel(0)->SetData(
74-
source.GenerateNoisySinewave(gen_amp, start_phase, gen_period, 20000, 100000, 0),
75-
0);
83+
auto wfm = new UniformAnalogWaveform;
84+
source.GenerateNoisySinewave(cmdBuf, queue, wfm, gen_amp, start_phase, gen_period, 20000, 100000, 0);
85+
g_scope->GetOscilloscopeChannel(0)->SetData(wfm, 0);
86+
wfm->PrepareForCpuAccess();
7687

7788
Unit hz(Unit::UNIT_HZ);
7889
LogVerbose("Frequency: %s\n", hz.PrettyPrint(gen_freq).c_str());

tests/Primitives/Averager.cpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,36 +68,39 @@ TEST_CASE("Primitive_Averager")
6868
SECTION("UniformAnalogWaveform")
6969
{
7070
//Input waveform
71-
auto wfm = dynamic_cast<UniformAnalogWaveform*>(
72-
source.GenerateNoisySinewave(1.0, 0.0, 200000, 20000, depth, 0.1));
73-
wfm->MarkModifiedFromCpu();
71+
UniformAnalogWaveform wfm;
72+
source.GenerateNoisySinewave(cmdBuf, queue, &wfm, 1.0, 0.0, 200000, 20000, depth, 0.1);
7473

7574
//Add a small DC offset to the waveform so we have a nonzero average
75+
wfm.PrepareForCpuAccess();
7676
float offset = 0.314159;
7777
for(size_t i=0; i<depth; i++)
78-
wfm->m_samples[i] += offset;
78+
wfm.m_samples[i] += offset;
79+
wfm.MarkModifiedFromCpu();
7980

8081
//Find the average using the base function
8182
double start = GetTime();
82-
float avg = Filter::GetAvgVoltage(wfm);
83+
float avg = Filter::GetAvgVoltage(&wfm);
8384
double dt = GetTime() - start;
84-
LogNotice("CPU: %.3f ms, average = %.3f\n", dt*1000, avg);
85+
LogNotice("CPU: %6.3f ms, average = %.7f\n", dt*1000, avg);
8586

8687
//Do the GPU version
8788
//Run twice, second time for score, so we don't count deferred init or allocations in the benchmark
8889
Averager acomp;
89-
float gpuavg = acomp.Average(wfm, cmdBuf, queue);
90+
float gpuavg = acomp.Average(&wfm, cmdBuf, queue);
9091
start = GetTime();
91-
gpuavg = acomp.Average(wfm, cmdBuf, queue);
92+
gpuavg = acomp.Average(&wfm, cmdBuf, queue);
9293
double gpudt = GetTime() - start;
93-
LogNotice("GPU: %.3f ms, average = %.3f, %.2fx speedup\n", gpudt*1000, gpuavg, dt / gpudt);
94+
LogNotice("GPU: %6.3f ms, average = %.7f, %.2fx speedup\n", gpudt*1000, gpuavg, dt / gpudt);
9495

9596
//Verify everything matches
96-
float epsilon = 0.0001;
97-
REQUIRE(fabs(avg - offset) < epsilon);
98-
REQUIRE(fabs(gpuavg - offset) < epsilon);
97+
//Noisy sine should be close to the desired offset
98+
float epsilon1 = 0.002;
99+
REQUIRE(fabs(avg - offset) < epsilon1);
100+
REQUIRE(fabs(gpuavg - offset) < epsilon1);
99101

100-
//done, clean up
101-
delete wfm;
102+
//and CPU and GPU versions should closely agree
103+
float epsilon2 = 0.0001;
104+
REQUIRE(fabs(gpuavg - avg) < epsilon2);
102105
}
103106
}

tests/Primitives/EdgeDetection.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,25 +68,25 @@ TEST_CASE("Primitive_FindZeroCrossings")
6868
SECTION("UniformAnalogWaveform")
6969
{
7070
//Input waveforms
71-
auto wfm = dynamic_cast<UniformAnalogWaveform*>(
72-
source.GenerateNoisySinewave(1.0, 0.0, 200000, 20000, depth, 0.1));
73-
wfm->MarkModifiedFromCpu();
71+
UniformAnalogWaveform wfm;
72+
source.GenerateNoisySinewave(cmdBuf, queue, &wfm, 1.0, 0.0, 200000, 20000, depth, 0.1);
73+
wfm.PrepareForCpuAccess();
7474

7575
//Find the reference zero crossings using the base function
7676
float threshold = 0.05;
7777
double start = GetTime();
7878
vector<int64_t> edges;
79-
Filter::FindZeroCrossings(wfm, threshold, edges);
79+
Filter::FindZeroCrossings(&wfm, threshold, edges);
8080
double dt = GetTime() - start;
8181
LogNotice("CPU: %.3f ms, %zu edges, %zu samples\n", dt*1000, edges.size(), depth);
8282

8383
//Do the GPU version
8484
//Run twice, second time for score, so we don't count deferred init or allocations in the benchmark
8585
LevelCrossingDetector ldet;
8686
auto& gpuedges = ldet.GetResults();
87-
size_t gpulen = ldet.FindZeroCrossings(wfm, threshold, cmdBuf, queue);
87+
size_t gpulen = ldet.FindZeroCrossings(&wfm, threshold, cmdBuf, queue);
8888
start = GetTime();
89-
gpulen = ldet.FindZeroCrossings(wfm, threshold, cmdBuf, queue);
89+
gpulen = ldet.FindZeroCrossings(&wfm, threshold, cmdBuf, queue);
9090
double gpudt = GetTime() - start;
9191
LogNotice("GPU: %.3f ms, %zu edges, %.2fx speedup\n", gpudt*1000, gpulen, dt / gpudt);
9292

@@ -106,8 +106,5 @@ TEST_CASE("Primitive_FindZeroCrossings")
106106
REQUIRE(delta <= 1);
107107
REQUIRE(delta >= -1);
108108
}
109-
110-
//done, clean up
111-
delete wfm;
112109
}
113110
}

0 commit comments

Comments
 (0)