gpt4 book ai didi

C++ 优化数组从 int 到 float 的转换

转载 作者:行者123 更新时间:2023-11-30 03:23:21 31 4
gpt4 key购买 nike

我试图通过将一些 Matlab 代码移植到 C++ 来加速它,我发现非常简单的操作在 C++ 中比在 Matlab 中慢得多。即,将整数数组转换为 float 。我正在使用带有 MKL 和 TBB 的英特尔 Parallel Studio 2018。

Matlab 中的这条线在我的笔记本电脑(Mac OS 10.13)上平均耗时 6 毫秒:

spec = single(spec_int); % spec_int 是 1000x4096 uint16

朴素的方法(单循环)大约需要 9 毫秒(不包括内存分配和初始化):

uint16_t *spec_int = (uint16_t *) MKL_malloc(4096 * 1000 * sizeof(uint16_t), 64);
float *spec = (float *) MKL_malloc(sizeof(float) * FRAME_SIZE, 64);

// Initialize spec_int

for(MKL_INT i = 0; i<FRAME_SIZE; i++)
spec[i] = spec_int[i];

在 TBB 中使用 parallel_for 大约需要 13 毫秒:

tbb::parallel_for( size_t(0), size_t(FRAME_SIZE), [&]( size_t i ) {
spec[i] = spec_int[i];
} );

我很困惑。我究竟做错了什么?如何在 C++ 中匹配 Matlab 的速度?

最佳答案

总结:您可能正在测量噪声:

相当确定您正在处理的只是来自先前(隐式)matlab 操作的内存缓存,加速了它。我重写了您的天真实现以使用查找表(因此这是一个没有类型转换的简单分配)。那并没有加快它的速度。这是值得注意的。

接下来,我运行了一个类似(但不同——以防止它被优化掉)的循环并对其进行计时。它的运行速度:

int main()
{
float index[65537] ;
for (int i = 0; i < 65537; i++)
index[i] = i;
uint16_t *pi = new uint16_t[4096 * 1000];
memset(pi, 0, sizeof(pi));
float *pf = new float[4096 * 1000];
memset(pf, 0, sizeof(pf));
clock_t begin = clock();
for (int i = 0; i < 4096 * 1000; ++i)
{
pf[i] = index[pi[i]]; //no conversion...simple copy(and not faster)
}
clock_t end = clock();
clock_t begin2 = clock();
for (int i = 0; i < 4096 * 1000; ++i)
{
pf[i] = index[pi[i]+1];
}
clock_t end2 = clock();
printf("%d\n", (long)end - begin);
printf("%d\n", (long)end2 - begin2);
}

输出:

9
2

我在实际的 float 转换中得到了类似的结果。所以我的理论是,Matlab 只是执行一些操作,在执行您正在计时的操作之前,这些操作会缓存重要的内存(顺便说一下,您可能正在使用不同的时间机制)。

这都是猜测,但这可能是您在没有 MATLAB 专家介入的情况下所能得到的最好结果。

上面 C# 的输出,顺便说一句:12, 4

关于C++ 优化数组从 int 到 float 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50419401/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com