我是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版本)