Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在OpenMP循环开始时获取循环索引_C_Optimization_Openmp - Fatal编程技术网

C 在OpenMP循环开始时获取循环索引

C 在OpenMP循环开始时获取循环索引,c,optimization,openmp,C,Optimization,Openmp,我有一个for循环,它的每个迭代几乎完全独立于其他每个迭代。我用OpenMP做了一些初步的实验,看看是否可以加快速度。使用一个简单的指令,我得到了三到四倍的速度增加。代码与此类似: #pragma omp parallel for default(none) shared(ptr1,ptr2) firstprivate(const2,k,inc,max) for(i = 0; i < max; i += inc) { float *ptr1_ = (*ptr1)[i>>

我有一个for循环,它的每个迭代几乎完全独立于其他每个迭代。我用OpenMP做了一些初步的实验,看看是否可以加快速度。使用一个简单的指令,我得到了三到四倍的速度增加。代码与此类似:

#pragma omp parallel for default(none) shared(ptr1,ptr2) firstprivate(const2,k,inc,max)
for(i = 0; i < max; i += inc)
{
    float *ptr1_ = (*ptr1)[i>>k][0];
    float v = ptr2[i/const2];
    // do stuff with data
}
#pragma omp parallel用于默认(无)共享(ptr1,ptr2)firstprivate(const2,k,inc,max)
对于(i=0;i>k][0];
浮点数v=ptr2[i/const2];
//处理数据
}
然后我开始优化单线程代码。在这个过程中,我发现我可以增加指针,而不是索引它们,无论出于什么原因,这都会带来合理的速度提升。现在的问题是,我想不出一个简单的方法来告诉OpenMP每个线程的指针从哪里开始。基本上,我想到的是以下几点

#pragma omp parallel default(none) shared(ptr1,ptr2) firstprivate(const1,inc,max)
{
    int chunk = max / (omp_get_num_threads()*inc);
    chunk = (chunk < 1)? 1: chunk;
    float *ptr1_ = &(*ptr1)[0][0] + chunk*omp_get_thread_num()*const1;
    float *ptr2_ = ptr2 + chunk*omp_get_thread_num();
    #pragma omp for schedule(static,chunk)
    for(i = 0; i < max; i += inc)
    {
        // do stuff with data
        ptr1_ += const1;
        ptr2_++;
    }
}
#pragma omp并行默认值(无)共享(ptr1,ptr2)firstprivate(const1,inc,max)
{
int chunk=max/(omp\u get\u num\u threads()*inc);
chunk=(chunk<1)?1:chunk;
float*ptr1\=&(*ptr1)[0][0]+块*omp\u get\u thread\u num()*const1;
float*ptr2=ptr2+chunk*omp\u get\u thread\u num();
#计划的pragma omp(静态、块)
对于(i=0;i
这似乎是可行的,尽管我花了一些时间来弄清楚如何计算指针偏移量,因为inc不是一个,我不确定这会如何影响块的含义。此外,我不太相信它能在边缘情况下正常工作(当max很小或不是num_threads*inc的整数倍时)。此外,代码要复杂得多,并且有对omp函数的直接调用,这是我以前不必依赖的。最后,通过强制使用调度方法和块大小,我限制了OpenMP实现的潜在优化


所以我的问题是,有没有办法在循环开始时获取线程的循环索引,这样我就不必以这种复杂的方式手动计算指针偏移量?

除非使用类似于
int first=1。。。对于(…){if(不太可能(first)){start_i=i;first=0;}…}
,如果不使用任何OpenMP调用和一些数学,就很难获得起始索引。可以使用什么OpenMP调用来获取索引?那可能比我的好。不过,在循环之前只需要发生一次,这正是您正在使用的。再加上数学。