diff --git a/lib/vkfft_short_impl.cc b/lib/vkfft_short_impl.cc index a068580a..78f59249 100644 --- a/lib/vkfft_short_impl.cc +++ b/lib/vkfft_short_impl.cc @@ -230,12 +230,11 @@ vkfft_short_impl::vkfft_short_impl(std::size_t fft_batch_size, std::size_t nfft, } void vkfft_short_impl::init_converter_() { - uhd::convert::id_type id; - id.input_format = "sc16_chdr"; - id.num_inputs = 1; - id.output_format = "fc32"; - id.num_outputs = 1; - _converter = uhd::convert::get_converter(id, 0)(); + _id.input_format = "sc16_chdr"; + _id.num_inputs = 1; + _id.output_format = "fc32"; + _id.num_outputs = 1; + _converter = uhd::convert::get_converter(_id, 0)(); _converter->set_scalar(1 / 32767.); } @@ -254,7 +253,7 @@ int vkfft_short_impl::work(int noutput_items, for (int i = 0; i < noutput_items / fft_batch_size_; ++i, in_buffer_index += vlen * 2, out_buffer_index += vlen) { - _converter->conv(&in[in_buffer_index], &buffer[0], vlen * 2); + _converter->conv(&in[in_buffer_index], &buffer[0], vlen); vkfft_offload((char *)&buffer[0], (char *)&out[out_buffer_index]); } diff --git a/lib/vkfft_short_impl.h b/lib/vkfft_short_impl.h index 4f07764e..6aab063c 100644 --- a/lib/vkfft_short_impl.h +++ b/lib/vkfft_short_impl.h @@ -220,6 +220,7 @@ class vkfft_short_impl : public vkfft_short, base_impl { boost::scoped_array input_buffer_; uhd::convert::converter::sptr _converter; void init_converter_(); + uhd::convert::id_type _id; public: vkfft_short_impl(std::size_t fft_batch_size, std::size_t nfft, bool shift); diff --git a/python/iqtlabs/CMakeLists.txt b/python/iqtlabs/CMakeLists.txt index 55709a5f..30793cd5 100644 --- a/python/iqtlabs/CMakeLists.txt +++ b/python/iqtlabs/CMakeLists.txt @@ -37,7 +37,6 @@ add_custom_target( ) if(VKFFT) GR_ADD_TEST(qa_vkfft ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_vkfft.py) -GR_ADD_TEST(qa_vkfft_short ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_vkfft_short.py) endif() GR_ADD_TEST(qa_tuneable_test_source ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_tuneable_test_source.py) GR_ADD_TEST(qa_retune_fft ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_retune_fft.py) diff --git a/python/iqtlabs/qa_iq_inference.py b/python/iqtlabs/qa_iq_inference.py index 80926d9d..0967332b 100755 --- a/python/iqtlabs/qa_iq_inference.py +++ b/python/iqtlabs/qa_iq_inference.py @@ -361,6 +361,5 @@ def test_instance(self): last_rx_freq = rx_freq - if __name__ == "__main__": gr_unittest.run(qa_iq_inference) diff --git a/python/iqtlabs/qa_vkfft.py b/python/iqtlabs/qa_vkfft.py index eb31f7d7..c88a4d69 100755 --- a/python/iqtlabs/qa_vkfft.py +++ b/python/iqtlabs/qa_vkfft.py @@ -208,22 +208,33 @@ from gnuradio import blocks, fft, iqtlabs, gr, gr_unittest -def run_fft(fft_block, points, fft_roll, input_items): +def run_fft(fft_block, short, points, fft_roll, input_items): + tb = gr.top_block() src1 = blocks.vector_source_c(input_items, vlen=points) dst1 = blocks.vector_sink_c(vlen=points) - tb = gr.top_block() - tb.connect(src1, fft_block) - tb.connect(fft_block, dst1) + if short: + v2s = blocks.vector_to_stream(gr.sizeof_gr_complex, points) + cis = blocks.complex_to_interleaved_short(False, 32767) + s2v = blocks.stream_to_vector(gr.sizeof_short, points * 2) + test_blocks = [src1, v2s, cis, s2v, fft_block, dst1] + else: + test_blocks = [src1, fft_block, dst1] + for i, b in enumerate(test_blocks, start=0): + if i: + tb.connect(test_blocks[i - 1], b) tb.run() - data = dst1.data() tb.stop() tb.wait() + data = dst1.data() del tb return data class qa_vkfft(gr_unittest.TestCase): - def test_instance(self): + def round_complex(self, l, n=3): + return [complex(round(x.real, n), round(x.imag, n)) for x in l] + + def run_comparison(self, vkfft_block, short): for fft_roll in (True, False): fft_batch_size = 1 points = 8 @@ -231,7 +242,7 @@ def test_instance(self): batch_input_items = [] for i in range(1, fft_batch_size + 1): batch_input_items.append( - 1j * np.arange(points) + 1j * np.arange(start=0, stop=(points * 0.1), step=0.1) ) # pytype: disable=wrong-arg-types sw_data = [] @@ -239,6 +250,7 @@ def test_instance(self): sw_data.extend( run_fft( fft.fft_vcc(points, True, [], fft_roll, 1), + 0, points, fft_roll, batch_input_items[i - 1], @@ -249,7 +261,8 @@ def test_instance(self): for i in range(1, fft_batch_size + 1): vkfft_data.extend( run_fft( - iqtlabs.vkfft(fft_batch_size, points, fft_roll), + vkfft_block(fft_batch_size, points, fft_roll), + short, points, fft_roll, batch_input_items[i - 1], @@ -257,7 +270,15 @@ def test_instance(self): ) if os.getenv("TEST_VKFFT", 0): - self.assertEqual(vkfft_data, sw_data) + self.assertEqual( + self.round_complex(vkfft_data), self.round_complex(sw_data) + ) + + def test_vkfft(self): + self.run_comparison(iqtlabs.vkfft, False) + + def test_short_vkfft(self): + self.run_comparison(iqtlabs.vkfft_short, True) if __name__ == "__main__": diff --git a/python/iqtlabs/qa_vkfft_short.py b/python/iqtlabs/qa_vkfft_short.py deleted file mode 100755 index b0acac50..00000000 --- a/python/iqtlabs/qa_vkfft_short.py +++ /dev/null @@ -1,229 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Apache License -# Version 2.0, January 2004 -# http://www.apache.org/licenses/ -# -# TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -# -# 1. Definitions. -# -# "License" shall mean the terms and conditions for use, reproduction, -# and distribution as defined by Sections 1 through 9 of this document. -# -# "Licensor" shall mean the copyright owner or entity authorized by -# the copyright owner that is granting the License. -# -# "Legal Entity" shall mean the union of the acting entity and all -# other entities that control, are controlled by, or are under common -# control with that entity. For the purposes of this definition, -# "control" means (i) the power, direct or indirect, to cause the -# direction or management of such entity, whether by contract or -# otherwise, or (ii) ownership of fifty percent (50%) or more of the -# outstanding shares, or (iii) beneficial ownership of such entity. -# -# "You" (or "Your") shall mean an individual or Legal Entity -# exercising permissions granted by this License. -# -# "Source" form shall mean the preferred form for making modifications, -# including but not limited to software source code, documentation -# source, and configuration files. -# -# "Object" form shall mean any form resulting from mechanical -# transformation or translation of a Source form, including but -# not limited to compiled object code, generated documentation, -# and conversions to other media types. -# -# "Work" shall mean the work of authorship, whether in Source or -# Object form, made available under the License, as indicated by a -# copyright notice that is included in or attached to the work -# (an example is provided in the Appendix below). -# -# "Derivative Works" shall mean any work, whether in Source or Object -# form, that is based on (or derived from) the Work and for which the -# editorial revisions, annotations, elaborations, or other modifications -# represent, as a whole, an original work of authorship. For the purposes -# of this License, Derivative Works shall not include works that remain -# separable from, or merely link (or bind by name) to the interfaces of, -# the Work and Derivative Works thereof. -# -# "Contribution" shall mean any work of authorship, including -# the original version of the Work and any modifications or additions -# to that Work or Derivative Works thereof, that is intentionally -# submitted to Licensor for inclusion in the Work by the copyright owner -# or by an individual or Legal Entity authorized to submit on behalf of -# the copyright owner. For the purposes of this definition, "submitted" -# means any form of electronic, verbal, or written communication sent -# to the Licensor or its representatives, including but not limited to -# communication on electronic mailing lists, source code control systems, -# and issue tracking systems that are managed by, or on behalf of, the -# Licensor for the purpose of discussing and improving the Work, but -# excluding communication that is conspicuously marked or otherwise -# designated in writing by the copyright owner as "Not a Contribution." -# -# "Contributor" shall mean Licensor and any individual or Legal Entity -# on behalf of whom a Contribution has been received by Licensor and -# subsequently incorporated within the Work. -# -# 2. Grant of Copyright License. Subject to the terms and conditions of -# this License, each Contributor hereby grants to You a perpetual, -# worldwide, non-exclusive, no-charge, royalty-free, irrevocable -# copyright license to reproduce, prepare Derivative Works of, -# publicly display, publicly perform, sublicense, and distribute the -# Work and such Derivative Works in Source or Object form. -# -# 3. Grant of Patent License. Subject to the terms and conditions of -# this License, each Contributor hereby grants to You a perpetual, -# worldwide, non-exclusive, no-charge, royalty-free, irrevocable -# (except as stated in this section) patent license to make, have made, -# use, offer to sell, sell, import, and otherwise transfer the Work, -# where such license applies only to those patent claims licensable -# by such Contributor that are necessarily infringed by their -# Contribution(s) alone or by combination of their Contribution(s) -# with the Work to which such Contribution(s) was submitted. If You -# institute patent litigation against any entity (including a -# cross-claim or counterclaim in a lawsuit) alleging that the Work -# or a Contribution incorporated within the Work constitutes direct -# or contributory patent infringement, then any patent licenses -# granted to You under this License for that Work shall terminate -# as of the date such litigation is filed. -# -# 4. Redistribution. You may reproduce and distribute copies of the -# Work or Derivative Works thereof in any medium, with or without -# modifications, and in Source or Object form, provided that You -# meet the following conditions: -# -# (a) You must give any other recipients of the Work or -# Derivative Works a copy of this License; and -# -# (b) You must cause any modified files to carry prominent notices -# stating that You changed the files; and -# -# (c) You must retain, in the Source form of any Derivative Works -# that You distribute, all copyright, patent, trademark, and -# attribution notices from the Source form of the Work, -# excluding those notices that do not pertain to any part of -# the Derivative Works; and -# -# (d) If the Work includes a "NOTICE" text file as part of its -# distribution, then any Derivative Works that You distribute must -# include a readable copy of the attribution notices contained -# within such NOTICE file, excluding those notices that do not -# pertain to any part of the Derivative Works, in at least one -# of the following places: within a NOTICE text file distributed -# as part of the Derivative Works; within the Source form or -# documentation, if provided along with the Derivative Works; or, -# within a display generated by the Derivative Works, if and -# wherever such third-party notices normally appear. The contents -# of the NOTICE file are for informational purposes only and -# do not modify the License. You may add Your own attribution -# notices within Derivative Works that You distribute, alongside -# or as an addendum to the NOTICE text from the Work, provided -# that such additional attribution notices cannot be construed -# as modifying the License. -# -# You may add Your own copyright statement to Your modifications and -# may provide additional or different license terms and conditions -# for use, reproduction, or distribution of Your modifications, or -# for any such Derivative Works as a whole, provided Your use, -# reproduction, and distribution of the Work otherwise complies with -# the conditions stated in this License. -# -# 5. Submission of Contributions. Unless You explicitly state otherwise, -# any Contribution intentionally submitted for inclusion in the Work -# by You to the Licensor shall be under the terms and conditions of -# this License, without any additional terms or conditions. -# Notwithstanding the above, nothing herein shall supersede or modify -# the terms of any separate license agreement you may have executed -# with Licensor regarding such Contributions. -# -# 6. Trademarks. This License does not grant permission to use the trade -# names, trademarks, service marks, or product names of the Licensor, -# except as required for reasonable and customary use in describing the -# origin of the Work and reproducing the content of the NOTICE file. -# -# 7. Disclaimer of Warranty. Unless required by applicable law or -# agreed to in writing, Licensor provides the Work (and each -# Contributor provides its Contributions) on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied, including, without limitation, any warranties or conditions -# of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -# PARTICULAR PURPOSE. You are solely responsible for determining the -# appropriateness of using or redistributing the Work and assume any -# risks associated with Your exercise of permissions under this License. -# -# 8. Limitation of Liability. In no event and under no legal theory, -# whether in tort (including negligence), contract, or otherwise, -# unless required by applicable law (such as deliberate and grossly -# negligent acts) or agreed to in writing, shall any Contributor be -# liable to You for damages, including any direct, indirect, special, -# incidental, or consequential damages of any character arising as a -# result of this License or out of the use or inability to use the -# Work (including but not limited to damages for loss of goodwill, -# work stoppage, computer failure or malfunction, or any and all -# other commercial damages or losses), even if such Contributor -# has been advised of the possibility of such damages. -# -# 9. Accepting Warranty or Additional Liability. While redistributing -# the Work or Derivative Works thereof, You may choose to offer, -# and charge a fee for, acceptance of support, warranty, indemnity, -# or other liability obligations and/or rights consistent with this -# License. However, in accepting such obligations, You may act only -# on Your own behalf and on Your sole responsibility, not on behalf -# of any other Contributor, and only if You agree to indemnify, -# defend, and hold each Contributor harmless for any liability -# incurred by, or claims asserted against, such Contributor by reason -# of your accepting any such warranty or additional liability. -# -# END OF TERMS AND CONDITIONS -# -# APPENDIX: How to apply the Apache License to your work. -# -# To apply the Apache License to your work, attach the following -# boilerplate notice, with the fields enclosed by brackets "[]" -# replaced with your own identifying information. (Don't include -# the brackets!) The text should be enclosed in the appropriate -# comment syntax for the file format. We also recommend that a -# file or class name and description of purpose be included on the -# same "printed page" as the copyright notice for easier -# identification within third-party archives. -# -# Copyright [yyyy] [name of copyright owner] -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -from gnuradio import gr, gr_unittest - -# from gnuradio import blocks -from gnuradio.iqtlabs import vkfft_short - - -class qa_vkfft(gr_unittest.TestCase): - def setUp(self): - self.tb = gr.top_block() - - def tearDown(self): - self.tb = None - - def test_instance(self): - # TODO: find workaround llvmpipe simulated gpu crashes under CI testing - # TODO: old UHD library vesion does not have automatic host-order. - try: - instance = vkfft_short(1, 1024, True) - except RuntimeError as e: - print(e) - - -if __name__ == "__main__": - gr_unittest.run(qa_vkfft)