我有如下定义的代码,但是它花费的时间太长,我知道原因是迭代次数太多,但是有没有一种解决方案可以使此循环更快,(每个循环必须从中读取一个浮点数一个文件并将其写入内存),共有15874861个数字。
float SysMem;
float fw;
unsigned long j;
for (j = 0 ; j < 15874861 ; j++)
{
fscanf(fp,"%f",&fw); // Read from file
*((float *) (weights+j*0x04)) = fw; // Write to memory
// Below lines are just to test, but even just read from file and writing is taking too long.
SysMem= *((float *) (weights+j*0x04)); // Read back from memory
if(fw != SysMem)
printf("Memory Error\n"); // If read back wrong flag a error
}
试图使其更快
答案 0 :(得分:0)
通过将文件映射到内存(如果使用的是Linux,请使用mmap),并通过优化程度最高的程序进行编译(可以通过传递-O3
标志来加快处理速度)您正在使用gcc / clang)
除了代替每次读取一次(并且不想使用mmap),还找到一种方法来一步读取大的浮点数,然后在需要更多内容时再次读取。
您也可以unroll the loop,因为您已经知道所需的迭代次数(或者您可以让编译器使用-O3标志对其进行优化)
编辑:不要自己展开循环,但要确保编译器通过使用适当的标志来尽最大努力展开循环
答案 1 :(得分:0)
这可能会有所不同,因为I / O是应该在这里发生的最慢的事情,但是所有这些强制转换都不会提高性能,甚至可能导致错误的代码。强制转换告诉编译器“我在这里做奇怪的事情”,这倾向于告诉编译器不要优化。
例如,在大多数平台上,float
的大小为4字节,并且在4的倍数地址上分配4字节值比在任意地址处更快。当编译器看到类型为float
或数组float
的变量时,它将在内存中正确对齐此变量,以能够使用快速4字节分配方法。当编译器看到(float *) (weights+j*0x04)
时,不确定是否为4的倍数,因此它可能会生成可以肯定地复制您期望的代码,但速度较慢,因为它会逐个复制单个字节。 (编译器不必生成较慢的代码:它很讨厌,并假设weights
正确对齐,并且生成的代码如果weights
未正确对齐则不会复制您的期望。 )
循环的主体应该是
fscanf(fp, "%f", weights[j]);
(假设您知道输入文件的格式正确,否则需要添加错误检查。)
答案 2 :(得分:0)
这就是我为数据操纵所做的。
{'IP - internet': {'IPv4': '225.138.42.248', 'IPv6': 'NA'}}
为什么我要这样做?
2原因,我没有在常规系统上运行它,而是定制板。 因此,我发现内存读/写的时间成本很高,IO也很慢。 所以我只是使用memcpy来移动数据。
谢谢大家的帮助和建议。