我正在研究一种必须做少量的算法 对大量小阵列的操作,有点独立。
提出一个想法:
一切都在漂浮物中。
然后,这个问题存在一些水平性:上述情况 操作必须在10k阵列上独立进行。
此外,不需要存储中间结果:例如,我没有 需要保留排序的数组,只需要最小的$ m $元素的总和。
整个事情已经用c ++编程并运行。我的问题是: 你会期望像这样的问题能够享受到显着的加速吗? (因子2或更多)与CUDA?
答案 0 :(得分:1)
如果您“仅”需要加速2倍,我建议在考虑GPGPU / CUDA之前先考虑更直接的优化可能性。例如。假设x86通过重写代码的性能关键部分来使用4路浮点SIMD来看看使用SSE来实现4倍的加速。虽然这会将你与x86联系起来,但它更便携,因为它不需要存在nVidia GPU。
话虽如此,您的代码库中甚至可能有更简单的优化机会,例如消除冗余操作(无用的副本和初始化是最受欢迎的)或使您的内存访问模式更加缓存友好。尝试使用合适的分析器分析您的代码,看看瓶颈在哪里。
但请注意,通常排序不适合SIMD或CUDA,但LU分解等其他操作可能会受益。
答案 1 :(得分:1)
只需几点,您可能已经合并:
1)如果你只需要m个最小元素,你最好只搜索最小元素,删除它并重复m次。
2)您是否已经在cpu上并行化了代码? OpenMP左右......
3)您是否考虑购买更好的硬件? (我知道这不是很好的想法,但是如果你想达到特定应用的性能目标,它有时候是最便宜的......)
如果你想在CUDA上做它,它应该在概念上工作,所以不会出现大问题。但是,总有一些小东西,取决于经验等等。
考虑用于排序的推力库,希望其他人可以建议一些好的LU分解算法。
答案 2 :(得分:1)
您可以在5行ArrayFire代码中运行此功能。我通过CPU获得了大约6倍的加速比。我超过推力(它是为矢量而不是矩阵设计的),速度达到了4倍。由于您只使用单个GPU,因此可以运行ArrayFire Free版本。
array x = randu(512,1000,f32);
array y = sort(x); // sort each 512-element column independently
array x = randu(15,15,1000,f32), y;
gfor (array i, x.dim(2))
y(span,span,i) = lu(x(span,span,i)); // LU-decomposition of each 15x15 matrix
请记住,当内存访问与32的倍数对齐时,GPU表现最佳,因此一堆32x32矩阵的性能优于31x31。