OpenMP中线程的数组的本地副本?

时间:2012-06-17 02:07:38

标签: c visual-studio-2010 openmp

我是OpenMP的新手,所以这可能是非常基础的。 我有一个功能:

void do_calc(int input1[], int input2[], int results[]);

现在,函数在计算期间修改input1[]但仍然可以将它用于另一次迭代(它以各种方式对其进行排序),input2[]对于每次迭代都是不同的,函数将结果存储在{{ 1}}。

在程序的一个线程版本中,我只是遍历各种results[]。在并行版本中我试试这个:

input2[]

这段代码有效但效率很低,因为我每次迭代都会将输入复制到#pragma omp parallel for reduction (+:counter) schedule(static) private (i,j) for (i = 0; i < NUMITER ; i++){ int tempinput1[1000]; int tempresults[1000]; int tempinput2[5] = derive_input_from_i(i, input2[]); array_copy(input, tempinput); do_calc(tempinput, tempinput2, tempresults); for (j = 0; j < 1000; j++) counter += tempresults[i] //simplified } ,每个线程只需要一个副本。然后可以在随后的tempinput调用中重用此副本。我想做的是:

do_calc

然后告诉线程存储#do this only once for every thread worker: array_copy(input, tempinput); 以便将来进行迭代。 我如何在OpenMP中实现它?

其他性能问题:

a)我想拥有适用于双/四/八核处理器的代码,让OpenMP确定线程工作者的数量,并为每个人复制输入一次;

b)我的算法受益于tempinput在前一次迭代中被排序(因为接下来的排序更快,因为键仅对类似的i稍微改变)所以我想确保迭代次数在线程和那个线程没有1获得input[]部分迭代,第2个线程获得0 ... NUMITER/n等。

b)不是那么重要但是要非常酷:)

(我使用的是Visual Studio 2010,我有OpenMP 2.0版本)

0 个答案:

没有答案