Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading UPC本地指针访问随机内存_Multithreading_Parallel Processing_Upc - Fatal编程技术网

Multithreading UPC本地指针访问随机内存

Multithreading UPC本地指针访问随机内存,multithreading,parallel-processing,upc,Multithreading,Parallel Processing,Upc,我试图使用本地指针访问当前线程与之有关联的内存 不幸的是,我的本地指针似乎没有指向我认为应该指向的地方 有人知道出了什么问题吗 编辑:我忘了提到下面的输出是通过运行此代码生成的,该代码有四个线程,即threads=4 我的代码: #include <upc.h> #include <stdio.h> #include <stdlib.h> int main(){ shared int * T = (shared int *) upc_all_all

我试图使用本地指针访问当前线程与之有关联的内存

不幸的是,我的本地指针似乎没有指向我认为应该指向的地方

有人知道出了什么问题吗

编辑:我忘了提到下面的输出是通过运行此代码生成的,该代码有四个线程,即
threads=4

我的代码:

#include <upc.h>
#include <stdio.h>
#include <stdlib.h>

int main(){

    shared int * T = (shared int *) upc_all_alloc(12, sizeof(int));
    if(!T)
        upc_global_exit(-1);

int i;
upc_forall(i=0; i<12; i++; &T[i]) T[i] = i;
upc_barrier;

if(MYTHREAD == 0)
    for(i=0; i<12; i++) printf("thread %d, T[%d] = %d\n", MYTHREAD, i, T[i]);
upc_barrier;

int my_start = (12/THREADS + 1)*MYTHREAD;
int my_end = (12/THREADS + 1)*(MYTHREAD+1) - 1;

int* T_local = (int*)&T[my_start];

for(i=my_start; i<=my_end; i++)
    printf("thread %d, T_local[%d] = %d, T[%d] = %d\n", MYTHREAD, 
            i-my_start, T_local[i-my_start], i, T[i]);
upc_barrier;

return 0;
}

使用循环布局(即blocksize==1)分配和声明数组T。这意味着与MYTHREAD有关联的第一个元素就是T[MYTHREAD]。因此,您可能应该如下初始化指向本地的指针:

int* T_local = (int*)&T[MYTHREAD];
在循环布局中,共享元素被循环传递给线程,这意味着每个线程都有一个非连续的分布式数组元素块。因此,例如,对于4个线程,线程0将与T[0]、T[4]和T[8]具有亲缘关系。线程0上指向local的正确初始化的T_local指针将访问共享数组的本地片中的这些元素(分别为T_local[0]、T_local[1]和T_local[2])


您对my_start和my_end的计算似乎假设了一个与T实际使用的不同(更大)的阻塞因子,这可能是造成您混淆的原因。

您的数组T是用循环布局分配和声明的(即blocksize==1)。这意味着与MYTHREAD有关联的第一个元素就是T[MYTHREAD]。因此,您可能应该如下初始化指向本地的指针:

int* T_local = (int*)&T[MYTHREAD];
在循环布局中,共享元素被循环传递给线程,这意味着每个线程都有一个非连续的分布式数组元素块。因此,例如,对于4个线程,线程0将与T[0]、T[4]和T[8]具有亲缘关系。线程0上指向local的正确初始化的T_local指针将访问共享数组的本地片中的这些元素(分别为T_local[0]、T_local[1]和T_local[2])

您对my_start和my_end的计算似乎假设了一个与T实际使用的不同(更大)的阻塞因子,这可能是您困惑的根源