这是我的情况,我有一个指向一些数据数组的指针数组......让我们说:
Data** array = malloc ( 100 * sizeof(Data*));
for(i = 0; i < 100; i++) array[i] = malloc (20 * sizeof(Data);
在并行区域内,我进行了一些使用该数据的操作。例如:
#pragma omp parallel num_threads(4) firstprivate(array)
{
function(array[0], array[omp_get_thread_num()];
}
第一个参数是只读的,但在所有线程中都是相同的......
问题是如果我使用不同的数据块作为第一个参数,即:array[omp_get_thread_num()+1],每个函数持续 1seg。但是当我使用相同的数据块数组 [0] 时,每个函数调用持续 4 段。
我的理论是,没有办法知道数组 [0] 是否会被函数更改,所以每个线程都要求一个副本并使其他线程拥有的副本无效,这应该解释延迟......
我试图像这样制作 array[0] 的本地副本:
#pragma omp parallel num_threads(4) firstprivate(array)
{
Data* tempData = malloc(20 * sizeof(Data));
memcpy(tempData,array[0], 20*sizeof(Data));
function(tempData, array[omp_get_thread_num()];
}
但我得到了相同的结果......就像线程没有“释放”数据块,所以其他线程可以使用它......
我必须注意,第一个参数并不总是 array[0] 所以我不能在 pragma 行中使用 firstprivate(array[0]) ...
问题是:
- 难道我做错了什么?
- 有没有办法“释放”一个共享的内存块,以便其他线程可以使用它?
试图让我理解非常困难,所以如果您需要更多信息,请告诉我!
在此先感谢...哈维尔
编辑:我无法更改函数声明,因为它位于库中!(ACML)