2017-03-01 67 views
1

我的代码中存在一种性能问题,这种问题源于所选的体系结构。任意轴上多维数组的遍历

我将以立方体的形式使用多维张量(基本上具有更多维度的矩阵)来存储我的数据。 由于在编译时未知维度,因此我无法使用Boost的MultidimensionalArray(IIRC),但必须使用我自己的解决方案。

现在,我自己保存每个维度。我有一个维度张量(比方说3),它包含很多2维的维度(在std :: vector中),每个维度都有一个维度为1的std :: vector,每个维度都包含一个std: :(数字)数据的向量。我为张量使用抽象基类,因此所有内容都有一个指向抽象类的指针,同时(秘密地)多维或单维。

我提取一个单一的数值数据点,通过给出张量的指数std :: list,得到的第一个元素,搜索相应的张量并将其余列表传递给张量)递归调用。

我现在必须对该数据进行多维快速傅立叶变换。我使用了一个线程池和作业对象,它可以在一维上从张量中复制数据,进行FFT并将数据写回。

我已经有逻辑来实现线程池和组织的尺寸FFT沿,但有一个问题:

我的数据结构是缓存unfriendliest兽,一个能想到的......而数据沿着第一个维度(即在单个一维张量中的数据)进行复制是合理的,但在其他方向上,我需要从各处复制我的数据。由于没有竞争条件(我确定每个并发FFT都在不同的数据点上),我想,我不会使用Mutex-Guard来让每个人都同时复制。然而,这大大减缓了这个过程(“我现在复制我的数据!” - “不,我现在复制我的数据!” - “但现在轮到我了!”)...

保护copy-一个互斥体,不会提高速度。具有1024个元素的矢量的FFT快得多,然后复制过程得到这些元素,导致几乎所有的线程在等待,而一个正在复制。

长话短说: 是否有任何一种多维数据结构,它不需要在编译时设置维度,使我可以快速遍历所有轴?我搜索了一会儿,除了Boost MultiArray之外没有任何东西出现。矢量化也不起作用,因为指数增长太快而无法保持通常的整型。


我想不出如何在座的代码示例,因为大多数代码是相当简单的,但如果需要,我可以得到英寸

+1

而不是分配(载体)载体的载体支持,也不能使用尺寸大小的矢量,然后一个矢量来存储所有数据? –

+0

每个维度中的大小是相同的。我的数据都是超立方体(现在)。将所有数据放入单个矢量的问题是索引。我试图索引向量,但我失败了,因为太小的int类型。 – Laray

+0

只是一个想法,你能把整个事物细分成更小的超立方体吗?假设子进程并不经常在同一个超立方体中,这意味着他们可以在不跳动的情况下访问数据,直到跳到下一个超立方体。 – Aziuth

回答

1

Eigen具有多维张量支持(名义上不支持,但由DeepMind人编写,所以“有点”支持?),并且FFTW具有从1d到3d的FFT。使用具有一维到三维FFT集的外部库将外包大部分辛苦工作。

编辑:实际上,FFTW具有用于螺纹n维的FFT

+0

目前看起来非常好。现在对于我来说,要理解这个模块是如何工作的,对于我来说(对于数学家来说更像是一个数学家)非常困难,但我会看看它! – Laray