Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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++_Multithreading_Visual Studio 2010_Openmp - Fatal编程技术网

C++ OpenMP-多个循环变量

C++ OpenMP-多个循环变量,c++,multithreading,visual-studio-2010,openmp,C++,Multithreading,Visual Studio 2010,Openmp,OpenMP“For”循环是否与多个循环变量一起工作?例如: int i; double k; #pragma omp parallel for for (k = 0, i = 0; k < 1; k += 0.1, i++) { } inti; 双k; #pragma-omp并行 对于(k=0,i=0;k1)在任何一个线程上?比如说,k不会只使用k=0.0、0.1和0.2计算N次吗?但是在这种情况下,k是共享的,不像是一个开放的MP循环增量……所以要注意k我不知道你打算用k做什么,但有

OpenMP“For”循环是否与多个循环变量一起工作?例如:

int i;
double k;
#pragma omp parallel for
for (k = 0, i = 0; k < 1; k += 0.1, i++)
{ }
inti;
双k;
#pragma-omp并行
对于(k=0,i=0;k<1;k+=0.1,i++)
{ }
没有OpenMP,它可以正常工作,但使用它会出现以下错误:

  • C3015:OPEMP“for”语句中的初始化形式不正确
  • C3019:OpenMP“for”语句中的增量格式不正确

您需要将代码转换为仅对循环本身使用
i
(即带有简单增量的
int
变量),并在循环控制的代码中使用
k

double k = 0.0;
int i;

for (i=0; i<10; i++) {
    // body of loop goes here
    k+=0.1;
}
double k=0.0;
int i;

对于(i=0;i您需要将代码转换为仅对循环本身使用
i
(即带有简单增量的
int
变量),并在循环控制的代码中使用
k

double k = 0.0;
int i;

for (i=0; i<10; i++) {
    // body of loop goes here
    k+=0.1;
}
double k=0.0;
int i;
对于(i=0;i你可以这样做

#pragma omp parallel for
for (int i = 0; i<10; i++) {
    double k = 0.1*i;
}
#pragma omp parallel 
{
    int nthreads = omp_get_num_threads();
    int ithread = omp_get_thread_num();
    int starti = ithread*10/nthreads;
    int finishi = (ithread+1)*10/nthreads;
    double start = 0.1*starti;
    double finish = 0.1*finishi;

    double k;
    int i;
    for (k = start, i = starti; k < finish; k += 0.1, i++) {
   }  
}
#pragma omp parallel for
对于(inti=0;i您可以这样做

#pragma omp parallel for
for (int i = 0; i<10; i++) {
    double k = 0.1*i;
}
#pragma omp parallel 
{
    int nthreads = omp_get_num_threads();
    int ithread = omp_get_thread_num();
    int starti = ithread*10/nthreads;
    int finishi = (ithread+1)*10/nthreads;
    double start = 0.1*starti;
    double finish = 0.1*finishi;

    double k;
    int i;
    for (k = start, i = starti; k < finish; k += 0.1, i++) {
   }  
}
#pragma omp parallel for

对于(int i=0;这可能会有帮助:增量必须是整数类型…始终这可能会有帮助:增量必须是整数类型…始终但在这种情况下,k不像开环MP增量那样共享…所以注意k我不知道你打算用k做什么,但有趣的事情从这里开始stuff@alexbuisson:是,视情况而定如何使用它,您很可能(举一个可能的例子)希望在OpenMP中使用
private(k)
#pragma
。k用于参数化函数。使用private(k)或如上所述是否意味着k永远不会被分配到完整范围(0-->1)在任何一个线程上?比如说,k不会只使用k=0.0、0.1和0.2计算N次吗?但是在这种情况下,k是共享的,不像是一个开放的MP循环增量……所以要注意k我不知道你打算用k做什么,但有趣的事情开始了stuff@alexbuisson:是的,取决于它的使用方式,您可能会(举一个可能的例子)要在OpenMP中使用
private(k)
#pragma
。k用于参数化函数。使用private(k)或如上所述不意味着k永远不会被分配到任何线程的完整范围(0-->1)中吗?也就是说,k不会仅使用k=0.0、0.1和0.2计算N次吗?