【发布时间】:2021-02-21 21:51:03
【问题描述】:
我正在尝试从一个数组数组复制到另一个数组,同时在目标中的数组之间留一个空格。
它们都是连续的,每个向量的大小都在 5000 到 52000 个浮点数之间,
output_jump 是向量大小的八倍,并且vector_count 在我的测试中有所不同。
我在https://stackoverflow.com/a/34450588/1238848 和https://stackoverflow.com/a/16658555/1238848 学到了最好的东西
但它仍然看起来很慢。
void copyToTarget(const float *input, float *output, int vector_count, int vector_size, int output_jump)
{
int left_to_do,offset;
constexpr int block=2048;
constexpr int blockInBytes = block*sizeof(float);
float temp[2048];
for (int i = 0; i < vector_count; ++i)
{
left_to_do = vector_size;
offset = 0;
while(left_to_do > block)
{
memcpy(temp, input, blockInBytes);
memcpy(output, temp, blockInBytes);
left_to_do -= block;
input += block;
output += block;
}
if (left_to_do)
{
memcpy(temp, input, left_to_do*sizeof(float));
memcpy(output, temp, left_to_do*sizeof(float));
input += left_to_do;
output += left_to_do;
}
output += output_jump;
}
}
【问题讨论】:
-
为什么您认为在将整个内容再次复制到目标之前复制到
temp变量比从源直接复制到目标要快?是什么让您得出这样的结论,即制作多个小副本,一次一小块,比只制作一个memcpy更快,因为一切都是连续的? -
如果涉及到
std::vector,这会容易得多。它们具有内置长度,因此不需要额外的参数。你也可以简单地将std::vector与a + b结合起来。 -
复制到
temp是没有意义和浪费的。摆脱它,你的速度就会翻倍。 -
你为什么手动将你的复制分成 2,048 个浮点数块?我确信
memcpy可以一次性处理所需的大小。 -
but still it seems so slow.你的尝试是比普通 memcpy 快还是慢?