Tag: openmp

使用GCC和OMP在C中的特定线程顺序

我需要组建4个团队,每个团队有4个线程,每个团队都有连续的处理器。 我期待的结果是,例如: Team 0 Thread 0 Processor: 0 Team 0 Thread 1 Processor: 1 Team 0 Thread 2 Processor: 2 Team 0 Thread 3 Processor: 3 Team 1 Thread 0 Processor: 4 Team 1 Thread 1 Processor: 5 Team 1 Thread 2 Processor: 6 Team 1 Thread 3 Processor: 7 Team 2 Thread 0 Processor: […]

c openmp平行于平行区域内

我的问题就像这个。 但我想做点不同的事…… 例如,在我的并行区域内,我想在4个线程上运行我的代码。 当每个线程进入for循环时,我想在8个线程上运行我的代码。 就像是 #pramga omp parallel num_threads(4) { //do something on 4 threads #pragma omp parallel for num_threads(2) for(int i=0;i<2;i++){ //do something on 8 threads in total } } 那么,有没有办法将每个(4)运行线程“拆分”为两个(新)线程,所以在for循环中有更多(8)个线程正在运行?

openmp慢了多个线程,想不通

我遇到一个问题,我的以下代码使用openmp运行速度较慢: chunk = nx/nthreads; int i, j; for(int t = 0; t < n; t++){ #pragma omp parallel for default(shared) private(i, j) schedule(static,chunk) for(i = 1; i < nx/2+1; i++){ for(j = 1; j < nx-1; j++){ T_c[i][j] =0.25*(T_p[i-1][j] +T_p[i+1][j]+T_p[i][j-1]+T_p[i][j+1]); T_c[nx-i+1][j] = T_c[i][j]; } } copyT(T_p, T_c, nx); } print2file(T_c, nx, file); 问题是当我运行多个线程时,计算时间会更长。

OpenMP并行化(Block Matrix Mult)

我正在尝试实现块矩阵乘法并使其更加并行化。 这是我的代码: int i,j,jj,k,kk; float sum; int en = 4 * (2048/4); #pragma omp parallel for collapse(2) for(i=0;i<2048;i++) { for(j=0;j<2048;j++) { C[i][j]=0; } } for (kk=0;kk<en;kk+=4) { for(jj=0;jj<en;jj+=4) { for(i=0;i<2048;i++) { for(j=jj;j<jj+4;j++) { sum = C[i][j]; for(k=kk;k<kk+4;k++) { sum+=A[i][k]*B[k][j]; } C[i][j] = sum; } } } } 我一直在玩OpenMP,但是在找出在最短的时间内完成这项工作的最佳方法仍然没有运气。

使用OpenMP在两个核上设置线程关联

我正在使用一个C程序,使用OpenMP 4.0在Windows7上使用gcc 4.9.2编译。 我的电脑是双核,有四个线程。 我想使用线程亲和力传播并使用2个线程放在不同的核心上。 所以当我从DOS设置环境变量时: 设置OMP_NUM_THREADS = 2 设置OMP_PROC_BIND =传播 设置OMP_PLACES =“核心” 我得到了变量OMP_DISPLAY_ENV = true,这个: libgomp: Invalid value for environment variable OMP_PLACES OPENMP DISPLAY ENVIRONMENT BEGIN _OPENMP = ‘201307’ OMP_DYNAMIC = ‘FALSE’ OMP_NESTED = ‘FALSE’ OMP_NUM_THREADS = ‘2’ OMP_SCHEDULE = ‘DYNAMIC’ OMP_PROC_BIND = ‘SPREAD’ OMP_PLACES = ” OMP_STACKSIZE = ‘12872703’ OMP_WAIT_POLICY = ‘PASSIVE’ OMP_THREAD_LIMIT […]

如何在OpenMp中管理共享变量

我正在尝试编写一个OpenMp程序。 我有一个for循环,迭代100次。 我把它分成10个线程。 每个线程运行10次迭代并根据某些条件生成一些计数。 因此,根据这个逻辑,每个线程将生成自己的计数。 我想要的只是将这个计数复制到一个变量,该变量将保存所有线程中所有计数的总和。 如果我们让这个变量(共享)在循环中写入,我猜它会序列化线程。 我只想将每个线程的最后一个计数复制到一个全局变量中。 这样我将只序列化10个赋值语句。 我试图使用lastprivate但我对如何使用它来满足我的要求感到困惑。 这是我的代码 #pragma omp parallel for private(i) schedule(dynamic) shared(count) for (i = 1; i <= 100 ; i++) { if(i%2==0) count++; } printf("Total = %d \n", count);

OpenMP指令如何由编译器处理

我想知道编译器如何处理OpenMP指令,比如gcc? 例如,在此代码中 int main(int argc, char *argv[]) { #pragma omp parallel printf(“Hello, world.\n”); return 0; } gcc的预处理器是否通过将OpenMP指令替换为其他代码来修改C代​​码? 在预处理之后和组装之前的代码是什么? 感谢致敬!

OpenMP:错误:’w.13’未在封闭并行中指定

我正在尝试使用OpenMP来并行化一个模拟生命游戏的简单程序。 我有以下function: void evolve_parallel(void *u, int w, int h) { unsigned (*univ)[w] = u; unsigned new[h][w]; #pragma omp parallel for firstprivate(univ, new, w, h), collapse(2), default(none) for_y for_x { int n = 0; for (int y1 = y – 1; y1 <= y + 1; y1++) for (int x1 = x – 1; x1 <= […]

分段创建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) […]

带有icc的OpenMP和线程本地存储标识符

这是一个简单的测试代码: #include __thread int a = 0; int main() { #pragma omp parallel default(none) { a = 1; } return 0; } gcc编译这个没有任何问题-fopenmp ,但icc (ICC) 12.0.2 20110112与-openmp抱怨 test.c(7):错误:必须在包含OpenMP并行编译指示的变量列表中指定“a”#pragma omp parallel default(none) 我不知道哪种范式(即shared , private , threadprivate )适用于这种类型的变量。 哪一个是正确使用的? 我在调用访问该线程局部变量的函数时得到了预期的行为,但是我在显式并行部分中访问它时遇到了麻烦。 编辑: 到目前为止,我最好的解决方案是通过函数返回指向变量的指针 static inline int * get_a() { return &a; }