【问题标题】:How to change this C code to prefetch some data?如何更改此 C 代码以预取一些数据?
【发布时间】:2013-01-20 13:03:27
【问题描述】:

我做了一个检查矩阵效率的应用程序。我使用各种方法(例如更改循环、2/3 循环、openmp 等)。剩下一件事:我必须检查数据预取。

代码:

#define SIZE 5000

for(int i=0;i<SIZE;i++)
 for(int j=0;j<SIZE;j++)
   mul+=tab[i][j]

通常单独处理prefetch 数据(当我们在单行中并递增j 时),但并非总是如此(例如tab[0][0] 永远不会prefeched 或当我们转到下一行时(loop i++ ,tab[i][0] ))。如何更改此代码以帮助proc prefetch 来自tab[0][0], tab[1][0],tab[2][0],tab[3][0] 等的数据,然后我们才会计算它们?

【问题讨论】:

  • 您使用的是哪个编译器/平台?
  • 我将 Visual Studio 与 openMP 一起使用

标签: c loops matrix openmp prefetch


【解决方案1】:

您可以使用预取内置函数:

void _m_prefetch(void *);

您希望在当前位置之前至少预取 128 个字节。您可能需要展开循环,以便在每次预取之间完成正确的工作量,否则您将在实际的预取指令上浪费时钟周期。

但是,我怀疑处理器会自行完成体面的预取工作,因为您正在“直接”读取内存[假设选项卡是二维编译时数组,而不是运行时构建大批]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多