我的代码中有一种(某种)性能问题,它源于所选择的架构。
我将以立方体的形式使用多维张量(基本上具有更多维度的矩阵)来存储我的数据。 由于在编译时不知道维度,我不能使用Boost的MultidimensionalArray(IIRC),但必须使用我自己的解决方案。
现在,我自己保存每个维度。我有一个维度张量(比如说3),它包含很多维度为2的张量(在std :: vector中),每个都有一个std :: vector,其张量为1,每个都有一个std: :(数值)数据的向量。我为张量使用了一个抽象的基类,因此其中的所有内容都是指向抽象类的指针,同时是(秘密地)多维或一维的。
我通过给张量的std :: index列表提取单个数值数据点,得到第一个元素,搜索相应张量并将列表的其余部分传递给a中的张量(类型)递归调用。
我现在必须对该数据进行多维快速傅里叶变换。我使用Threadpool和Job-Objects,它可以在一个维度上从Tensor复制数据,进行FFT并将数据写回。
我已经有逻辑来实现ThreadPool并将维度组织成FFT,但是有一个问题:
我的数据结构是缓存 - 非最友好的野兽,人们可以想到......虽然沿着第一个维度进行数据复制(在单个1D-Tensor中使用它的数据)是合理的快速,但在其他方向,我需要从各处复制我的数据。
由于没有竞争条件(我确保每个并发FFT都在不同的数据点上),我想,我不会使用Mutex-Guard让所有人同时复制。然而,这大大减慢了整个过程(“我现在复制我的数据!” - “不,我现在复制我的数据!” - “但现在轮到我了!”......)
使用互斥锁保护副本进程不会提高速度。具有1024个元素的向量的FFT更快,然后复制过程获得这些元素,导致几乎所有的线程都在等待,而一个是复制。
长话短说: 是否有任何类型的多维数据结构,不需要在编译时设置维度,这允许我沿所有轴快速遍历?我现在搜索了一会儿,除了Boost MultiArray之外什么也没发现。矢量化也不起作用,因为索引增长太快而无法保持常规的int类型。
我无法想到如何在这里展示代码示例,因为大多数代码都相当简单,但如果需要,我可以将其提供。
答案 0 :(得分:1)
Eigen具有多维张量支持(名义上不受支持,但由DeepMind人员编写,因此“稍微”支持?),而FFTW具有1d至3d FFT。使用带有一组一维到三维FFT的外部库会将大部分艰苦工作外包出去。
编辑:实际上,FFTW支持线程n维FFT