问题标签 [cufft]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
image-processing - 袖带图像处理
我继承了一个图像处理应用程序。试图在这里弄清楚事情。我有三个问题。1) 我的 F2C、C2C、C2F 顺序是否正确?2)我应该在一个方向运行一次C2C吗?3)我应该使用哪个方向(向前或向后)?
背景:
输入和输出是二维图像。
首先使用 cufftF2C(现成的 cuda)完成 R2C,然后完成 C2C。这是由原始开发人员手工编码的。最后使用 cufftC2F 完成 C2R(现成的 cuda)
结果是一幅很棒的画面,只是出现了难看的锯齿形线条。最初的开发者使用 1D 计划(nx = x 和 batch = y)。我想用 2D 计划(nx = x 和 ny = y)替换这些。我还想用现成的 cuda cufftC2C 替换自制的 C2C。
cuda - cuFFT 循环 FFT 需要更大的批量
我目前正在尝试循环运行多个 FFT,以克服 cuFFT 计划的最大 1.28 亿个元素。因此,例如,我将在一个循环中运行 1.28 亿个元素。
我的程序对于单个 FFT 调用工作得很好,但循环似乎不起作用。我想可能是因为我如何抵消 FFT。这是我如何做到的一个片段:
上面的代码返回错误的结果。有人可以帮我解决问题吗?
cuda - 袖带的内存要求
我有四个 cufftHandles,我使用 cufftPlanMany 来初始化它们中的每一个(一起)。
我正在使用 cufftGetSizeMany() 来估计每个人所需的内存。
假设 s0 是第一个的大小,s1 是第二个的大小,依此类推。
我使用这四个计划进行fft和ifft,然后最后我将它们全部销毁。
我的问题是,这四个计划所需的实际总内存是否等于
total_size = s0 + s1 + s2 + s3
,
或者
请注意,我一次使用它们中的每一个,但我在开始时将它们全部计划在一起,并在最后将它们全部销毁。
c++ - 为什么在这个 libcufft_static 示例中出现“对 `__cudaRegisterLinkedBinary_60_....` 的未定义引用”错误?
我在 Ubuntu 16.04 上使用 CUDA 7.5 SDK,通过nvidia-cuda-toolkit
包安装。我正在尝试使用 cuFFT 的回调功能编译一个简单的测试程序;该示例的源代码可在 GitHub 上获得。
按照使用回调功能进行编译的说明,我将源代码编译为可重定位设备代码并链接到libcufft_static.a
:
在上述序列中,最终命令失败并出现一系列错误,都与此类似:
它抱怨许多丢失的符号,都以__cudaRegisterLinkedBinary_
. 我不认为我做错了什么,因为相同的命令序列在我手头的 CentOS 7 机器上正常工作。
我的 SDK 是否可能以某种方式配置错误?我在 SO 和其他地方看到的所有类似问题的提及都是未能执行上面显示的单独编译步骤;我认为情况并非如此。
cuda - 如何判断 cuda 代码是否正在使用可重定位设备代码编译?
为了使用CUFFT 回调,限制之一是必须使用可重定位的可重定位设备代码编译代码。
当这个条件不满足时,就会发生不好的事情;无声的失败、错误的答案等。
我已经让我当前的构建工作,但我想让这段代码更加健壮,以防止未来项目中的错误编译。
有没有办法在编译单元内检测到这一点?例如预处理器标志
cufft - FFT 一维变换
我想使用 cufft 来执行 FFT,我创建了一个数组 [1,2,3,4,5,6,7,8],然后我使用
创建一个计划,然后我使用
执行 FFT。在使用它之前,我已将数组转换为图像部分为 0 的复杂数组。我得到了这样的结果:
首先是原始数据元素,之后是结果 cufftExecC2C 计算。我想知道这个结果是否正确。我认为第一个输出结果元素是 36=1+2+3+4+5+6+7+8 而它是 4.5。那么错在哪里呢?
cuda - cufftSetStream 导致垃圾输出。难道我做错了什么?
根据文档,该cufftSetStream()
功能
将 CUDA 流与 cuFFT 计划相关联。现在,在计划执行期间进行的所有内核启动都通过关联的流完成 [...直到...] 流被另一个 cufftSetStream() 调用更改。
不幸的是,结果变成了垃圾。这是一个示例,通过两种方式执行一堆转换来演示这一点:一次是每个流都有自己的专用计划,一次是重复使用单个计划,如上面的文档所示。前者的行为符合预期,重用/cufftSetStream 方法在大多数转换中都有错误。我在 CentOS 7 linux 上使用 Cuda 编译工具、7.0 版、V7.0.27 版试用过的两张卡(GTX 750 ti、Titan X)上观察到了这一点;并发布 7.5、V7.5.17。
编辑:有关解决问题的一种方法,请参阅下面的“修复”评论。
典型输出
为每个流提供自己专用的 fft 计划 ... 100 个转换中的 0 个有错误
通过 cufftSetStream 对多个流重用相同的 fft 计划 ... 100 个转换中有 87 个有错误
python - Scikit cuda FFT 大数据
我最近下载了用于 FFT 的最新 scikit。但是,我遇到了一个问题。我的数据大小和窗口大小为 2^19。进入 fft 函数的数组大小为 524288,远低于文档中列出的 2^27 元素限制。
然而,当我运行代码并使用 MATLAB 和 Scipy 的 FFT 函数对其进行检查时,这些值在计算过程中逐渐变为零。我不知道如何增加批量大小并且仍然有正确的数字。一些建议会很好。
c++ - 错误后 cuFFT 无法恢复
在上次启动失败后,我找不到启动 cuFFT 处理的方法。
这是一个最小的例子。主要思想如下:我们创建一个简单的 cuFTT 处理器,可以管理其资源(设备内存和 cuFFT 计划)。我们检查该处理器是否进行 FFT。然后我们要求创建太多计划,因此我们强制执行 cuFFT 错误。然后我们释放所有资源并尝试重复成功启动。但是,处理器在故障后无能为力。
首先,这是一个相当长的序言:
接下来,我们定义一个简单的 cuFFT 处理器,它可以管理其资源(设备内存和 cuFFT 计划)
以下是我们将如何释放资源:
下面是主要功能的实现:
最后,程序
如果我使用 small length = 1 << 18
,则不会发生错误。但是,对于大的length = 1 << 21
两个错误出现:
第一个错误是预期错误,我们是故意这样做的。但第二个不是。尽管重置了设备并成功分配了新资源,但 cuFFT 未能执行 FFT。
我使用 GTX 970。我尝试了以下所有组合:cuda 6.5、cuda 7.5、32 位平台、64 位平台等,但没有成功。
cuda - 为什么 cuFFT 性能会因输入重叠而受到影响?
我正在尝试使用 cuFFT 的回调功能即时执行输入格式转换(例如,计算 8 位整数输入数据的 FFT,而无需先将输入缓冲区显式转换为float
. 在我的许多应用程序中,我需要计算输入缓冲区上的重叠FFT,如上一个 SO 问题中所述。通常,相邻的 FFT 可能重叠 FFT 长度的 1/4 到 1/8。
cuFFT 具有类似 FFTW 的接口,通过函数的idist
参数cufftPlanMany()
明确支持这一点。具体来说,如果我想计算大小为 32768 且连续输入之间有 4096 个样本重叠的 FFT,我将设置idist = 32768 - 4096
. 从产生正确输出的意义上说,这确实可以正常工作。
但是,以这种方式使用 cuFFT 时,我看到了奇怪的性能下降。我设计了一个测试,以两种不同的方式实现这种格式转换和重叠:
明确告诉 cuFFT 输入的重叠性质:
idist = nfft - overlap
如上所述设置。安装一个加载回调函数,它只是根据需要在提供给回调的缓冲区索引上执行从int8_t
到的转换。float
不要告诉 cuFFT 输入的重叠性质;骗它一个 dset
idist = nfft
。然后,让回调函数通过计算应该为每个 FFT 输入读取的正确索引来处理重叠。
此 GitHub gist 中提供了一个通过时序和等效测试实现这两种方法的测试程序。为简洁起见,我没有在这里全部复制。该程序计算了一批 1024 个 32768 点的 FFT,它们重叠了 4096 个样本;输入数据类型是 8 位整数。当我在我的机器上运行它时(使用 Geforce GTX 660 GPU,在 Ubuntu 16.04 上使用 CUDA 8.0 RC),我得到以下结果:
方法 2 明显更快,这是我没想到的。查看回调函数的实现:
方法一:
方法二:
方法 2 有一个复杂得多的回调函数,甚至涉及到整数除以非编译时间值!我希望这比方法 1 慢得多,但我看到的是相反的情况。对此有很好的解释吗?当输入重叠时,cuFFT 的处理结构是否可能大不相同,从而导致性能下降?
如果可以从回调中删除索引计算(但这需要将重叠指定为 cuFFT),我似乎应该能够实现比方法 2 快得多的性能。
编辑:在 下运行我的测试程序后nvvp
,我可以看到 cuFFT 显然似乎以不同的方式构建其计算。很难理解内核符号名称,但内核调用分解如下:
方法一:
__nv_static_73__60_tmpxft_00006cdb_00000000_15_spRealComplex_compute_60_cpp1_ii_1f28721c__ZN13spRealComplex14packR2C_kernelIjfEEvNS_19spRealComplexR2C_stIT_T0_EE
: 3.72 毫秒spRadix0128C::kernel1Tex<unsigned int, float, fftDirection_t=-1, unsigned int=16, unsigned int=4, CONSTANT, ALL, WRITEBACK>
: 7.71 毫秒spRadix0128C::kernel1Tex<unsigned int, float, fftDirection_t=-1, unsigned int=16, unsigned int=4, CONSTANT, ALL, WRITEBACK>
:12.75 毫秒(是的,它被调用了两次)__nv_static_73__60_tmpxft_00006cdb_00000000_15_spRealComplex_compute_60_cpp1_ii_1f28721c__ZN13spRealComplex24postprocessC2C_kernelTexIjfL9fftAxii_t1EEEvP7ComplexIT0_EjT_15coordDivisors_tIS6_E7coord_tIS6_ESA_S6_S3_
: 7.49 毫秒
方法二:
spRadix0128C::kernel1MemCallback<unsigned int, float, fftDirection_t=-1, unsigned int=16, unsigned int=4, L1, ALL, WRITEBACK>
: 5.15 毫秒spRadix0128C::kernel1Tex<unsigned int, float, fftDirection_t=-1, unsigned int=16, unsigned int=4, CONSTANT, ALL, WRITEBACK>
: 12.88 毫秒__nv_static_73__60_tmpxft_00006cdb_00000000_15_spRealComplex_compute_60_cpp1_ii_1f28721c__ZN13spRealComplex24postprocessC2C_kernelTexIjfL9fftAxii_t1EEEvP7ComplexIT0_EjT_15coordDivisors_tIS6_E7coord_tIS6_ESA_S6_S3_
: 7.51 毫秒
有趣的是,看起来 cuFFT 调用两个内核来实际使用方法 1 计算 FFT(当 cuFFT 知道重叠时),但使用方法 2(它不知道 FFT 重叠),它只用一。对于在这两种情况下使用的内核,它似乎在方法 1 和 2 之间使用了相同的网格参数。
我不明白为什么它应该在这里使用不同的实现,尤其是在输入 stride 之后istride == 1
。在转换输入处获取数据时,它应该只使用不同的基地址;我认为算法的其余部分应该完全相同。
编辑2:我看到一些更奇怪的行为。我偶然意识到,如果我未能适当地破坏 cuFFT 手柄,我会看到测量性能的差异。例如,我修改了测试程序以跳过破坏 cuFFT 句柄,然后以不同的顺序执行测试:方法 1、方法 2、然后方法 2 和方法 1。我得到以下结果:
因此,在为测试用例创建计划时,性能似乎会根据是否存在其他 cuFFT 计划而发生变化!使用分析器,我看到内核启动的结构在两种情况下没有变化;内核似乎都执行得更快。我对这种影响也没有合理的解释。