我试着用openmp来找出奇怪的结果。
并行"for“运行速度更快与openmp的预期。但是当openmp禁用时,串行"for“运行得更快(没有/openmp选项)。与2013年相比)。
测试代码
const int n = 5000;
const int m = 2000000;
vector <double> a(n, 0);
double start = omp_get_wtime();
#pragma omp parallel for shared(a)
for (int i = 0; i < n;
我有一个OpenMP程序来计算循环中的变量。
int a[1000000];
int b[1000000];
int c[1000000];
int d[1000000];
#pragma omp parallel for private(i) shared(a,b,c,d)
for (i=0;i<1000000;++i)
{
d[i] = b[i]*a[i] + c[i]+10;
}
我使用perf和perf,说瓶颈是在记忆、读写方面。
第一个问题:是否可以使用OpenMP将数组A、B、C、D拆分,并将它们放入不同的内存组?
第二个问题:如果我把数组A,B,C,D分成更小的数组,它们
给定一个非常大的数组,我只想选择与某些条件匹配的元素。我事先就知道要匹配的元素的数量。我现在的pseucode是:
filter(list):
out = list of predetermined size
i = 0
for element in list
if element matches condition
out[i++] = element
return out
当试图并行前一个算法时,我天真的方法只是使I原子的增量(它是OpenMP项目的一部分,因此使用了#语用omp原子)。然而,与串行实现相比,此实现降低了性能。有哪些更有效的算法来实现这一
我已经编写了一个C++应用程序,它必须处理大量数据。使用OpenMP,我很好地并行化了处理阶段,令人尴尬的是,我发现输出写入现在是瓶颈。我决定在那里也使用parallel for,因为我输出项目的顺序是无关紧要的;它们只需要作为连贯的块输出。
下面是输出代码的简化版本,显示了除"collect data in related“循环中的两个自定义迭代器之外的所有变量。我的问题是:这是解决这个问题的正确和最佳方法吗?我读到过barrier杂注,我需要它吗?
long i, n = nrows();
#pragma omp parallel for
for (i=0; i<n; i+
我继承了一段Fortran代码,负责为我们拥有的8核机器并行化它。我有两个版本的代码,我试图使用openMP编译器指令来加快速度。它能在一段代码上工作,但另一段不行,我不知道为什么--它们几乎是一样的!我使用和不带openMP标记运行每段代码,第一个代码显示了速度改进,但没有第二个代码。我希望我能解释清楚.
代码示例1:(显著改进)
!$OMP PARALLEL DO
DO IN2=1,NN(2)
DO IN1=1,NN(1)
SCATT(IN1,IN2) = DATA((IN2-1)*NN(1)+IN1)/(NN(1)*NN(2))
我有几个遵循这种模式的循环:
do j = ms,mst
ic = ic + 1
df = mm(j)*data(ic)
dff(1:3)= vec(1:3)*df*qm
end do
如您所见,变量ic在j的每个周期都会更新,ic的结果由变量df使用。如果我使用OpenMP的原子操作,可能会降低OpenMP的性能。你知
局部变量应自动私有于每个线程。如果一个本地指针指向并行区域之外的某个地址,如
A * a = new A[10];
int i, j;
for (i = 0; i < 10; i++){
A * local_i = &a[i];
// do sth ...
#pragma omp parallel for
for (j = 0; j < 10; j++){
A * local_j = &a[j];
local_j->x = 1.0f;
// ...
}
}
delete[
我编写了一个CUDA内核,它执行两个数组的数组添加( arr1和arr2 )。应该将arr1的哪个索引添加到arr2的哪个索引中的信息,该索引存储在数组idx中。
下面是一个代码示例:
__global__ add(float* arr1, float* arr2, int* idx, int length)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
// each thread performs (length) additions,
// arr2 is (lenght) times larger than
我在linux机器上使用的是gcc的openMP,用的是C语言。在openmp并行for循环中,我可以将静态分配的数组声明为private。考虑下面的代码片段:
int a[10];
#pragma omp parallel for shared(none) firstprivate(a)
for(i=0;i<4;i++){
一切都像预期的那样工作。但如果我动态分配一个,
int * a = (int *) malloc(10*sizeof(int));
#pragma omp parallel for shared(none) firstprivate(a)
的值(至少是a1...9)
我试图用OpenMP/CilkPlus并行化test_function主内的for-循环中的函数调用(如C代码所示)。对于每次迭代,读/写操作只发生在2d_array的一行上,因此迭代中不存在数据依赖(2d_array在可用线程之间共享,默认情况下我是私有的)。
void test_function(int *in, int len)
{
int i, value;
int *x, *low, *high;
x = x_alloc + 4;
for (i=0; i<len; i++)
x[i] = in[i];
for(i=1;
如何使用C# Parallel.For在以下OpenMP代码中实现
OpenMP代码
#pragma omp parallel
{
float[] data = new float[1000];
#pragma omp for
for(int i = 0; i < 500; i++)
{
for(int j = 0; j < 1000; j++)
{
data[j] =100;
// do some computation using data
}
}
}
我也尝试了以下方法,但这并不是Op
我使用以下代码,它包含嵌套在另一个for -循环中的OpenMP并行for循环。不知何故,这段代码的性能比顺序版本慢了4倍(忽略#语用omp并行)。
每次调用方法时,OpenMp是否都必须创建线程?在我的测试中,它被称为10000次直接在对方之后。
我听说,有时OpenMP会保持线程旋转。我还尝试设置OMP_WAIT_POLICY=active和GOMP_SPINCOUNT=INFINITE。当我移除openMP杂注时,代码大约快10倍。请注意,包含此代码的方法将被调用10000次。
for (round k = 1; k < processor.max; ++k) {
我想知道使用/openmp的VC++编译器的行为。我使用的是cmakefilelist附带的第三方库()。所以我生成了Visual Studio解决方案来编译它。CMake可以识别编译器的openmp功能,并且在VS everithing中可以很好地编译。但在执行时,我每次运行程序都会得到不同的结果。如果我同时运行程序的两个实例,结果会更糟。所以我仔细查看了一下源代码,发现openmp与list和map迭代器一起使用
#pragma omp parallel
for (Views::const_iterator iter = sfm_data.GetViews().begin(); iter