C++ OpenMp中的应用程序速度低于串行代码c++;
我正在努力完成OpenMp任务C++ OpenMp中的应用程序速度低于串行代码c++;,c++,performance,openmp,C++,Performance,Openmp,我正在努力完成OpenMp任务 unsigned long index; for (unsigned int par1 = 0; par1 < limit; par1++) { for (unsigned int par2 = 0; par2 < par1; par2++) { index = getDistance(par1, par2) / param; if (index < size) { hist[i
我必须优化一些方法的计算-其中包括直方图 我花了3天时间,尝试了大约50种不同的方法,但仍然 我的代码比串行执行慢 有人能告诉我我做错了什么吗? 你有什么线索可以解决这个问题吗? 以下是需要优化的代码: (par1通常小于10000,下面发布的代码放在某个方法中,在测试过程中调用大约100次)unsigned long index; for (unsigned int par1 = 0; par1 < limit; par1++) { for (unsigned int par2 = 0; par2 < par1; par2++) { index = getDistance(par1, par2) / param; if (index < size) { hist[index]++; } } }
问题是每次迭代需要进行的计算量是可变的 -迭代计数器增长时,运算量急剧增长 我知道减价可能是最好的办法,但我不知道怎么做 将其应用于此数组 这是我的一次尝试,但它比串行执行慢(我将两个循环合并为一个):
无符号长索引; for(无符号整数par1=0;par1
欢迎使用StackOverflow可能重复。请阅读。不幸的是,由于种种原因,这是一个糟糕的问题。要找到我指出的那个复制品真的很容易。你应该提供一个更具体的标题。如果关注的是特定的性能问题,请提供一个、您的特定性能观察/异常和详细的系统规范。
signed long max=elements*elements; int par1=0; int par2=0; 无符号长索引; #pragma omp并行用于firstprivate(par1、par2、索引、最大值、大小)共享(直方图) 用于(无符号长x=0;x
par2) { 索引=getDistance(par1,par2)/param; 如果(索引<大小) { #布拉格omp原子 直方图[指数]+; } } } 是序列化的,所有线程都将努力读取和写入该位置。这将您的收益限制在直方图[index]++
的频率上,这很可能被并行化开销消耗掉。复制(通过@Zulan链接)有一个可行的解决方案。索引>=size
signed long max = elements * elements; int par1 = 0; int par2 = 0; unsigned long index; #pragma omp parallel for firstprivate(par1, par2, index, max, size) shared(histogram) for (unsigned long x = 0; x < max; x++) { par1 = x / elements; par2 = x % elements; if(par1 > par2) { index = getDistance(par1, par2) / param; if (index < size) { #pragma omp atomic histogram[index]++; } } }