我无法弄清楚omp_nest_lock_t和omp_lock_t lck之间的区别; 这段代码完美地同步了longtask(),但在执行时无法弄清楚它们之间的区别;
omp_nest_lock_t lck_n; //omp_lock_t lck;
int t_id;
omp_init_nest_lock(&lck_n); //omp_init_lock(&lck);
omp_set_num_threads(6);
#pragma omp parallel private(t_id) shared(lck_n)
{
t_id = omp_get_thread_num();
omp_set_nest_lock(&lck_n); //omp_set_lock(&lck);
printf("\nhi by %d\n",t_id);
long_task();
printf("My thread id is %d.\n", id);
omp_unset_nest_lock(&lck_n); //omp_unset_lock(&lck);
}
omp_destroy_nest_lock(&lck_n); //omp_destroy_lock(&lck);
Run Code Online (Sandbox Code Playgroud) 目标构造将代码区域从主机卸载到目标设备。变量p,v1,v2,明确地映射到使用在地图子句目标设备。目标数据也一样,
那么,这意味着:
关于“目标数据”结构,
我的意思是这些代码之间的卸载机制有什么区别:
void vec_mult1(float *p, float *v1, float *v2, int N)
{
int i;
init(v1, v2, N);
#pragma omp target map(to: v1[0:N], v2[:N]) map(from: p[0:N])
#pragma omp parallel for
for (i=0; i<N; i++)
p[i] = v1[i] * v2[i];
output(p, N);
}
void vec_mult2(float *p, float *v1, float *v2, int N)
{
int i;
init(v1, v2, N);
#pragma omp target device(mic0) data map(to: v1[0:N], v2[:N]) map(from: p[0:N])
{
//this code runs …Run Code Online (Sandbox Code Playgroud) 我原以为变量“i”将达到最大值 11,然后“for”工作共享区域将被取消,代码是:
omp_set_num_threads(11);
#pragma omp parallel
{
#pragma omp for
for(i=0;i<9999;i++){
printf("%d by %d \n",i,omp_get_thread_num());
if(i>11) //2
{
#pragma omp cancel for
}
}//for
}//parallel omp pragma
Run Code Online (Sandbox Code Playgroud)
但是我持有最大值 9998 的变量我认为这意味着工作共享区域没有被取消。