自动化软件优化和调优

计算科学 软件 高性能计算
2021-12-15 02:03:11

我正在编写使用大量图形操作的代码;许多更高级别的算法迭代所有图边并对它们进行一些处理。有一个迭代器方法可以返回一批边,如下所示:

G.get_edges(edges,iterator,num_edges);
for (k = 0; k < num_edges; k++) {
    i = edges[k,0];
    j = edges[k,1];
    // Do something to (i,j)
}

在程序的其他地方,有一个称为参数的参数batch_size,它是调用此算法时要操作的标准边数。目前,我已经batch_size硬编码为 64,认为缓存行可以在我的计算机上保存 128 个整数。

自动调整批量大小的明智方法是什么?我想做一些类似于ATLAS如何选择块大小而无需阅读 ATLAS 源代码的事情。

我对这应该如何工作的最佳猜测:

  1. 编译代码的初始版本,在运行时选择批处理大小

  2. 使用不同的批量大小多次运行测试套件。

  3. 选择测试套件运行最快的批量大小b

  4. 生成一个.h包含预处理器指令的新文件,该指令将批处理大小设置为b.

  5. 编译其余的代码,现在在编译时知道批量大小。

2个回答

如果您认为硬编码此值可能会给编译器带来优势,您可以在 shell 或 Python 中编写直接在 .h 文件中执行的编辑、编译、运行循环。如果运行时间足够短,那么迭代batch_size合理范围内的所有值应该很简单。

我认为这些天运行自动调整构建相当罕见,但并非不可能。查看您的代码示例,我实际上没有看到任何缓存重用,因此我不确定您的预期好处是什么。

正如比尔所暗示的那样,除非您有证据表明您的编译器在没有静态编译的情况下运行效率低下,否则您可能应该将批处理大小作为运行时参数。