【发布时间】:2019-03-20 23:11:09
【问题描述】:
我初始化了一个巨大的 98306 x 98306 二维数组。我创建了一个核函数来计算低于某个阈值的元素总数。
#pragma omp parallel for reduction(+:num_below_threshold)
for(row)
for(col)
index = get_corresponding_index(row, col);
if (array[index] < threshold)
num_below_threshold++;
为了进行基准测试,我测量了线程数设置为 1 时内核执行的执行时间。我注意到内核第一次执行大约需要 11 秒。下一次调用内核在同一个数组上执行一个线程只用了大约 3 秒。我认为这可能是与缓存有关的问题,但似乎并不相关。造成这种情况的可能原因是什么?
这个数组被初始化为:
float *array = malloc(sizeof(float) * 98306 * 98306);
for (int i = 0; i < 98306 * 98306; i++) {
array[i] = rand() % 10;
}
同样的内核被应用到这个数组两次,第二次执行时间比第一个内核快得多。我虽然在 Linux 上进行了延迟分配,但这不应该是因为初始化函数的问题。任何解释都会有所帮助。谢谢!
【问题讨论】:
-
发布minimal reproducible example。特别是,如何您是如何初始化数组的?
-
@EOF 我添加了示例。但是我没有看到数组的初始化方式究竟是如何影响执行结果的
标签: c++ c multithreading parallel-processing openmp