Tag: 并行处理

CUDA:if语句中的__syncthreads()

我有一个关于CUDA同步的问题。 特别是,我需要对if语句中的同步进行一些澄清。 我的意思是,如果我将__syncthreads()放在if语句的范围内,该块语句被块内的一小部分线程击中,会发生什么? 我认为一些线程将“永远”等待其他线程不会达到同步点。 所以,我编写并执行了一些示例代码来检查: __global__ void kernel(float* vett, int n) { int index = blockIdx.x*blockDim.x + threadIdx.x; int gridSize = blockDim.x*gridDim.x; while( index < n ) { vett[index] = 2; if(threadIdx.x < 10) { vett[index] = 100; __syncthreads(); } __syncthreads(); index += gridSize; } } 令人惊讶的是,我观察到输出非常“正常”(64个元素,块大小为32): 100 100 100 100 100 100 100 100 […]

在OpenMP中插入排序

我正在尝试为插入排序编写OpenMP解决方案,但我遇到问题,让它并行运行并给出正确的结果:)。 有没有办法让Insertion排序并行运行。 这是我的代码: void insertionsort(int *A, int num) { // clock_t start, stop; // // start=clock(); int k; #pragma omp parallel for shared(A) private(k) for(int n = 1; n 0 && A[k-1]> key;k–) { A[k] = A[k-1]; } A[k] = key; } // stop=clock(); // cas = (double)(stop-start)/CLOCKS_PER_SEC; }

并行化矩阵按行和按行使用OpenMP按行计算

对于我的一些家庭作业,我需要通过向量实现矩阵的乘法,按行和列并行化。 我确实理解行版本,但我在列版本中有点困惑。 可以说我们有以下数据: 行版本的代码: #pragma omp parallel default(none) shared(i,v2,v1,matrix,tam) private(j) { #pragma omp for for (i = 0; i < tam; i++) for (j = 0; j < tam; j++){ // printf("Hebra %d hizo %d,%d\n", omp_get_thread_num(), i, j); v2[i] += matrix[i][j] * v1[j]; } } 这里的计算是正确的,结果是正确的。 列版本: #pragma omp parallel default(none) shared(j,v2,v1,matrix,tam) private(i) { for […]

彼得森算法的错误实现?

我试图学习一些关于并行编程的东西,所以我尝试实现Peterson的算法,这是一个简单的例子,其中一个共享计数器增加2个线程。 我知道彼得森因等待繁忙而不是最佳,但我只是出于学习原因尝试过。 我认为这段代码的关键部分是在线程函数add中共享counter递增的地方。 所以我在计数器递增之前调用enter_section函数,之后调用leave_function 。 这部分错了吗? 我对关键部分的评估错了吗? 问题是当这两个线程完成时,计数器有时会给出一个不可预见的值。 它必须是线程之间的同步问题,但我只是看不到它…感谢您的帮助。 #include #include #include int counter; /* global shared counter */ int flag[2] = {0, 0}; /* Variables for Peterson’s algorithm */ int turn = 0; typedef struct threadArgs { pthread_t thr_ID; int num_of_repeats; int id; } THREADARGS; void enter_section (int thread) { int other = 1 […]

前缀和的并行化(Openmp)

我有两个向量,a [n]和b [n​​],其中n是一个大数。 a[0] = b[0]; for (i = 1; i < size; i++) { a[i] = a[i-1] + b[i]; } 使用此代码,我们尝试实现a [i]包含b []中所有数字的总和,直到b [i]。 我需要使用openmp并行化这个循环。 主要的问题是a [i]取决于[i-1],因此我想到的唯一直接方法是等待每个[i-1]数字准备就绪,这需要花费大量时间并没有任何意义。 openmp中是否有任何方法可以解决这个问题?

如何检索C / Linux上的处理器数量?

我正在编写一个小型C应用程序,它使用一些线程来处理数据。 我希望能够知道某台机器上的处理器数量,而不使用system()和小脚本。 我能想到的唯一方法是解析/ proc / cpuinfo 。 任何其他有用的建议?

如何使用MPI_Gatherv从包括主节点在内的不同处理器中收集不同长度的字符串?

我试图在主节点处从所有处理器(包括主节点)收集不同长度的不同字符串到单个字符串(字符数组)。 这是MPI_Gatherv的原型: int MPI_Gatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int *recvcounts, const int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)**. 我无法定义一些参数,如recvbuf , recvcounts和displs 。 任何人都可以在C中提供源代码示例吗?

openmp – 用于文本文件读取和使用管道的while循环

我发现openmp不支持while循环(或者至少不太喜欢它们)。 而且也不喜欢’!=’运算符。 我有这段代码。 int count = 1; #pragma omp parallel for while ( fgets(buff, BUFF_SIZE, f) != NULL ) { len = strlen(buff); int sequence_counter = segment_read(buff,len,count); if (sequence_counter == 1) { count_of_reads++; printf(“\n Total No. of reads: %d \n”,count_of_reads); } count++; } 关于如何管理这个的任何线索? 我在某地读过(包括stackoverflow的另一篇文章)我可以使用管道。 那是什么 ? 以及如何实施它?

使用MPI,在发送消息之前,似乎已收到消息

在我的测试程序中,我正在从一个进程向另一个进程发送消息。 跟踪printfs似乎表明在发送之前收到的消息是什么,为什么会这样? #include #include #include /* Run with two processes */ void main(int argc, char *argv[]) { int rank, i, count; float data[100],value[200]; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); printf(“before if:%d\n”,rank); if(rank==1) { printf(“in if:%d\n”,rank); for(i=0;i<100;++i) data[i]=i; MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD); } else { printf("else:%d\n",rank); MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status); printf("P:%d Got data from processor %d \n",rank, status.MPI_SOURCE); MPI_Get_count(&status,MPI_FLOAT,&count); printf("P:%d Got %d elements \n",rank,count); […]

并行计算 – 输出混乱?

我正在尝试学习并行计算的基础知识,但我在计算机上遇到了一个问题。 看看下面的代码。 基本上,我想打印出“Hello World!”这一行。 我的电脑拥有的每一个核心。 我的电脑有四个核心,因此它应打印出该行四次。 如果我使用已注释掉的’cout’行而不是’printf’行,输出将全部混乱。 这是因为’\ n’转义命令与“Hello World!”分开执行,因此新行输出将随机发生。 ‘printf’行是这个问题的解决方案,因为该行是一次性执行的(不会分成像’cout’行这样的部分)。 但是,当我使用’printf’时,我的输出仍然混乱,就像我使用’cout’一样。 我不知道为什么会这样做。 我在另一台计算机上尝试了完全相同的代码,它完美无缺。 只有我的电脑继续使用’printf’混淆输出。 我已经通过电子邮件向我的CS教授发了电子邮件,他不知道为什么要在我的电脑上这样做。 我知道我在计算机上正确设置了OpenMP。 有并行计算经验的人是否知道为什么这会弄乱我的电脑? #include #include #include #include using namespace std; int main() { #pragma omp parallel { printf(“Hello World!\n”); //cout << "Hello World!\n" << endl; } return 0; } 为了显示我正在谈论的内容,这是我在计算机上运行上述代码时的输出: 你好禾 你好,世界! RLD! 你好,世界!