我的代码中存在一种性能问题,这种问题源于所选的体系结构。任意轴上多维数组的遍历
我将以立方体的形式使用多维张量(基本上具有更多维度的矩阵)来存储我的数据。 由于在编译时未知维度,因此我无法使用Boost的MultidimensionalArray(IIRC),但必须使用我自己的解决方案。
现在,我自己保存每个维度。我有一个维度张量(比方说3),它包含很多2维的维度(在std :: vector中),每个维度都有一个维度为1的std :: vector,每个维度都包含一个std: :(数字)数据的向量。我为张量使用抽象基类,因此所有内容都有一个指向抽象类的指针,同时(秘密地)多维或单维。
我提取一个单一的数值数据点,通过给出张量的指数std :: list,得到的第一个元素,搜索相应的张量并将其余列表传递给张量)递归调用。
我现在必须对该数据进行多维快速傅立叶变换。我使用了一个线程池和作业对象,它可以在一维上从张量中复制数据,进行FFT并将数据写回。
我已经有逻辑来实现线程池和组织的尺寸FFT沿,但有一个问题:
我的数据结构是缓存unfriendliest兽,一个能想到的......而数据沿着第一个维度(即在单个一维张量中的数据)进行复制是合理的,但在其他方向上,我需要从各处复制我的数据。由于没有竞争条件(我确定每个并发FFT都在不同的数据点上),我想,我不会使用Mutex-Guard来让每个人都同时复制。然而,这大大减缓了这个过程(“我现在复制我的数据!” - “不,我现在复制我的数据!” - “但现在轮到我了!”)...
保护copy-一个互斥体,不会提高速度。具有1024个元素的矢量的FFT快得多,然后复制过程得到这些元素,导致几乎所有的线程在等待,而一个正在复制。
长话短说: 是否有任何一种多维数据结构,它不需要在编译时设置维度,使我可以快速遍历所有轴?我搜索了一会儿,除了Boost MultiArray之外没有任何东西出现。矢量化也不起作用,因为指数增长太快而无法保持通常的整型。
我想不出如何在座的代码示例,因为大多数代码是相当简单的,但如果需要,我可以得到英寸
而不是分配(载体)载体的载体支持,也不能使用尺寸大小的矢量,然后一个矢量来存储所有数据? –
每个维度中的大小是相同的。我的数据都是超立方体(现在)。将所有数据放入单个矢量的问题是索引。我试图索引向量,但我失败了,因为太小的int类型。 – Laray
只是一个想法,你能把整个事物细分成更小的超立方体吗?假设子进程并不经常在同一个超立方体中,这意味着他们可以在不跳动的情况下访问数据,直到跳到下一个超立方体。 – Aziuth