Tag: 并行处理

分段创建arrays时使用OpenMP时出错

在访问for循环内的数组时,我遇到了分段错误。 我想要做的是生成DNA串的所有子序列。 当我在for中创建数组时发生了这种情况。 阅读一段时间后,我发现openmp限制了堆栈大小,因此使用堆更安全。 所以我更改代码以使用malloc,但问题仍然存在。 这是完整的代码: #include #include #include #include #include #define DNA_SIZE 26 #define DNA “AGTC” static char** powerset(int argc, char* argv) { unsigned int i, j, bits, i_max = 1U <= sizeof(i) * CHAR_BIT) { fprintf(stderr, “Error: set too large\n”); exit(1); } omp_set_num_threads(2); char** subsequences = malloc(i_max*sizeof(char*)); #pragma omp parallel for shared(subsequences, argv) […]

MPI_Gather()将中心元素转换为全局矩阵

这是来自MPI_Gather 2Darrays的后续问题。 情况如下: id = 0 has this submatrix |16.000000| |11.000000| |12.000000| |15.000000| |6.000000| |1.000000| |2.000000| |5.000000| |8.000000| |3.000000| |4.000000| |7.000000| |14.000000| |9.000000| |10.000000| |13.000000| ———————– id = 1 has this submatrix |12.000000| |15.000000| |16.000000| |11.000000| |2.000000| |5.000000| |6.000000| |1.000000| |4.000000| |7.000000| |8.000000| |3.000000| |10.000000| |13.000000| |14.000000| |9.000000| ———————– id = 2 has this submatrix […]

如何将Mandelbrot的每个像素计算划分为不同的节点?

我的问题是我应该使用什么数据结构将工作分配给每个线程并从中获取计算值。 在我看来,第一件事是填充矢量[0] ..矢量[63999](对于800×800像素),其结构包含x,y和iterate_value。 将这些向量传递给每个节点 – >然后将给定向量进一步划分到每个核心(Os-thread) – >然后将给定向量进一步划分到每个线程。 有没有其他可能的方式来发送和接收值? 如果我以矢量方式进行,我应该通过传递值传递矢量还是通过引用传递,在这种情况下哪一个更好?

在__device / global__ CUDA内核中动态分配内存

根据CUDA编程指南 ,第122页,只要我们使用计算体系结构2.x,就可以在设备/全局函数内动态分配内存。 我的问题是,当我尝试这个时,我得到命令行消息: 命令“some command”-gencode = arch = compute_10,code = \“sm_10,compute_10 \”-gencode = arch = compute_20,code = \“sm_20,compute_20 \”等…… 接下来是一个错误,表示您无法从设备/全局函数调用主机函数(malloc)。 上面的消息显示它正在尝试在compute 1.x下编译。 我正在使用VS2010并在“CUDA C / C ++”属性页中将“代码生成”设置为“compute_20,sm_20”,因此我不确定为什么它仍在尝试在compute 1.x下编译。 我肯定使用支持2.x的卡。 有任何想法吗?

在编写openCL代码时,它如何在没有GPU的单核机器上执行?

嘿所有,我目前正在将FORTRAN 77的光线跟踪器移植到C进行研究项目。 移植完要素后,问题是我们如何进行并行化。 在实验室中,我可以访问几台不同的Opteron机器,有2到8个内核,但没有GPU(目前)。 我们正在运行64b gentoo。 GPGPU版本(非常)是可取的,但项目中只有一个程序员,维护单独的非GPU和GPU版本不是一种选择。 此外,代码将是GPL,并且我们希望看到它被其他可能具有完全不同硬件的人使用。 因此,整个程序必须易于编译/运行,而无需GPU或甚至多核系统。 OpenCl似乎是一个不错的选择,因为它可以在没有GPU的机器上运行,但是这个代码将如何在单核或32b系统上运行? 是否有可能以这样的方式编写代码,以便在没有openCL的情况下轻松编译代码?

在OpenMP中为每个内部循环启动一个线程

我是OpenMP的新手,我正在尝试启动一个单独的线程来处理2D数组中的每个项目。 基本上,这个: for (i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { a[i][j] = b[i][j] + c[i][j]; 我正在做的是这样的: #pragma omp parallel for shared(a,b,c) private(i,j) reduction(+:diff) schedule(dynamic) for (i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { a[i][j] […]

如何在循环中重用MPI_Scatter和MPI_Gather

我试图学习如何多次使用MPI_Scatter和MPI_Gather ,并在等待这两个MPI函数完成后打印出结果。 在进程0,程序的顶部,我想使用一个调用Scatter和Gather的while循环。 完成所有计算后,我想将此数组发送回这些函数以进行更多计算。 我在下面的代码中解释了我想要做什么。 /*…..*/中的注释是我想要实现的任务。 以下代码使用4个处理器运行。 :$ mpicc test.c -o test :$ mpirun -np 4 test #include #include #include int main(int argc, char **argv) { int size, rank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); int globaldata[8]; int localdata[2]; int counter, i; if (rank == 0) { for (i=0; i<size*2; i++)//initializing array to all zeros, […]

MPI:在完成工作后帮助另一个人

这是我的问题: 给定一个初始间隔[a,b]进行并行化并假设流程比其他流程更快,我想做一个流程,当它完成其块(工作)时,我会“帮助”另一个(j),帮助这个case意味着在它和进程i(将要帮助的那个)之间平均分割进程j的块(它仍在工作的块)。 我已经了解了这个算法,但我不知道如何使用MPI通信function(如Broadcast,Allgather,send,recv)来实现它:我想使用所有进程共享的数组“arr” &size的大小等于所有进程的数量。 arr [i] = 1表示进程i已完成工作,否则等于-1。 我将其所有元素初始化为-1,当排名“rank”的进程完成其工作时,它确实arr [rank] = 1并且等待工作进程注意它并向它发送新块。 这是我想要实现的“伪代码”: MPI_Init ( &argc, &argv ); MPI_Comm_rank ( MPI_COMM_WORLD, &rank ); MPI_Comm_size ( MPI_COMM_WORLD, &nb_proc ); int i; int a = 0, b = max; //initial interval [a,b] to parallelize int j; arr[nb_proc]; for(j = 0; j < 10; j++) { arr[j] = […]

如何使用OpenMP实现argmax?

我正在尝试使用OpenMP实现argmax。 如果简短,我有一个计算浮点值的函数: double toOptimize(int val); 我可以通过以下方式获得最大化值的整数: double best = 0; #pragma omp parallel for reduction(max: best) for(int i = 2 ; i best) best = v; } 现在,我如何获得对应于最大值的值? 编辑: 我正在尝试这个,但想确保它是有效的: double best_value = 0; int best_arg = 0; #pragma omp parallel { double local_best = 0; int ba = 0; #pragma omp for reduction(max: best_value) […]

如何在MPI_Comm_split之后分配句柄?

说,我有8个进程。 当我执行以下操作时,MPU_COMM_WORLD通信器将被分成两个通信器。 具有偶数id的进程将属于一个通信器,具有奇数id的进程将属于另一个通信器。 color=myid % 2; MPI_Comm_split(MPI_COMM_WORLD,color,myid,&NEW_COMM); MPI_Comm_rank( NEW_COMM, &new_id); 我的问题是这两个传播者的手柄在哪里。 拆分之后,处理器的ID为0 1 2 3 4 5 6 7将变为0 2 4 6 | 1 3 5 7。 现在,我的问题是:假设我想在特定的通信器中发送和接收,比如托管偶数ID的那个,然后当我使用错误的通信器从0到2发送消息时,消息可能最终在第二个通信器中,它是否正确? 提前谢谢您的澄清! if(new_id < 2){ MPI_Send(&my_num, 1, MPI_INT, 2 + new_id, 0, NEW_COMM); MPI_Recv(&my_received, 1, MPI_INT, 2 + new_id, 0, NEW_COMM, MPI_STATUS_IGNORE); } else { MPI_Recv(&my_received, 1, MPI_INT, […]