Tag: openmp

运行给定线程的核心是什么?

是否有函数或任何其他方式以编程方式知道我的程序(pid)的给定线程正在运行的处理器的核心是什么? 如果可能的话,OpenMP或Pthreads解决方案都会对我有所帮助。 谢谢。

在OpenMP中使用GDB

使用GDB我似乎无法在OpenMP线程中打印共享变量的值。 例如,使用以下程序: #include #include #include int main(int argc, char *argv[]) { int priv, tid, pub = 100; #pragma omp parallel private(priv, tid) num_threads(2) { tid = omp_get_thread_num(); priv = tid * 10; #pragma omp sections { #pragma omp section { printf(“SECTION 0: tid=%d, priv=%d, pub=%d\n”, tid, priv, pub); } #pragma omp section { printf(“SECTION 1: […]

使用OpenMP停止GCC自动矢量化

我一直在努力使我的代码能够被GCC自动矢量化,但是,当我包含-fopenmp标志时,它似乎停止了所有自动矢量化的尝试。 我正在使用ftree-vectorize -ftree-vectorizer-verbose=5进行矢量化和监控。 如果我不包含该标志,它会开始向我提供有关每个循环的大量信息,如果它是矢量化的,为什么不。 当我尝试使用omp_get_wtime()函数时,编译器停止,因为它无法链接。 一旦包含了标志,它就会简单地列出每个函数并告诉我它中的向量化0循环。 我已经阅读了其他一些地方已经提到这个问题,但他们并没有真正找到任何解决方案: http://software.intel.com/en-us/forums/topic/295858 http:// gcc。 gnu.org/bugzilla/show_bug.cgi?id=46032 。 OpenMP有自己的处理矢量化的方法吗? 我需要明确告诉它吗?

什么限制了这个简单的OpenMP程序的扩展?

我试图了解48核系统上的并行化限制(4xAMD Opteron 6348,2.8 Ghz,每个CPU 12个核心)。 我写了这个微小的OpenMP代码来测试加速,我认为这是最好的情况(任务是令人尴尬的并行): // Compile with: gcc scaling.c -std=c99 -fopenmp -O3 #include #include int main(){ const uint64_t umin=1; const uint64_t umax=10000000000LL; double sum=0.; #pragma omp parallel for reduction(+:sum) for(uint64_t u=umin; u<umax; u++) sum+=1./u/u; printf("%e\n", sum); } 我惊讶地发现缩放是高度非线性的。 使用48个线程运行代码需要大约2.9s,使用36个线程运行3.1s,使用24个线程运行3.7s,使用12个线程运行4.9s,使用1个线程运行代码需要57s。 不幸的是,我不得不说计算机上运行一个进程使用100%的一个核心,因此可能会影响它。 这不是我的过程,所以我无法结束它来测试差异,但不知何故,我怀疑这是在19到20倍的加速和理想的48倍加速之间的区别。 为了确保它不是OpenMP问题,我同时运行了两个程序副本,每个程序有24个线程(一个用umin = 1,umax = 5000000000,另一个用umin = 5000000000,umax = 10000000000)。 在这种情况下,程序的两个副本在2.9s之后完成,因此它与使用单个程序实例运行48个线程完全相同。 用这个简单的程序阻止线性缩放的是什么?

C OpenMP并行quickSort

在C ++中使用openMP时,我再次陷入困境。 这次我正在尝试实现并行快速排序。 码: #include #include #include #include #include #include #define SWITCH_LIMIT 1000 using namespace std; template void insertionSort(std::vector &v, int q, int r) { int key, i; for(int j = q + 1; j = q && v[i] > key ) { v[i+1] = v[i]; –i; } v[i+1] = key; } } stack<pair > […]

在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在每次运行程序时只创建一次线程?

我正在尝试并行化由第三方编写的大型程序。 我无法透露代码,但我会尽力给出我想做的最接近的例子。 基于以下代码。 正如您所看到的,由于“并行”子句在INS循环中,因此每次迭代都会完成线程的创建/销毁,这是非常昂贵的。 鉴于我无法将Initializors …等移动到“while”循环之外。 – 基础代码 void funcPiece0() { // many lines and branches of code } void funcPiece1() { // also many lines and branches of code } void funcCore() { funcInitThis(); funcInitThat(); #pragma omp parallel { #pragma omp sections { #pragma omp section { funcPiece0(); }//omp section #pragma omp section { […]

并行化矩阵按行和按行使用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 […]

使用OpenMP和OpenSSL时内存泄漏和seg故障

我有一个庞大的代码(我的学校项目),我使用Openssl 。 一切都工作完美,工具我决定我会multithreading。 我选择openmp作为我的线程环境,因为它非常简单易学(至少我需要的基础很简单)。 我的整个代码看起来像这样: struct mystr[10]; omp_set_num_threads(10); #pragma omp parallel { mystr[omp_get_thread_num()] = call_fun_which_uses_openssl(); } CRYPTO_cleanup_all_ex_data(); 我的call_fun_which_uses_openssl函数使用低级openssls api函数( MD4((unsigned char*)&string, strlen(string), (unsigned char*)&digest);而不是MD4_CTX ctx等)。 我的函数使用RSA,DSA,…并且无法访问任何全局变量,它使用的每个变量都在call_fun_which_uses_openssl声明,所以像我这样做multithreading应该保证这些变量保持私有。 虽然,我有时会在此代码中出现seg错误。 我读到CRYPTO_cleanup_all_ex_data不是线程安全的(但我需要它因为内存泄漏)但是我在并行区域外使用它,对吧? 当我删除openmp调用时,每次都有效,所以multithreading和openssl一定存在问题。 任何想法如何解决? 在我看来它应该工作,因为call_fun_which_uses_openssl的线程调用为每个线程创建自己的私有变量,应该没有问题…请,帮助:)

Mac OS X Lion上的OpenMP编译失败(memcpy和SSE内在函数)

我偶然发现了以下问题。 下面的代码片段在Mac OS X上没有与我试过的任何Xcode链接(4.4,4.5) #include #include #include int main(int argc, char *argv[]) { char *temp; #pragma omp parallel { __m128d v_a, v_ar; memcpy(temp, argv[0], 10); v_ar = _mm_shuffle_pd(v_a, v_a, _MM_SHUFFLE2 (0,1)); } } 代码仅作为示例提供,并且在运行时会出现段错误。 关键是它不能编译。 使用以下行完成编译 /Applications/Xcode.app/Contents/Developer/usr/bin/gcc test.c -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk -mmacosx-version-min=10.7 -fopenmp Undefined symbols for architecture x86_64: “___builtin_ia32_shufpd”, referenced from: _main.omp_fn.0 in ccJM7RAw.o […]