【问题标题】:Remove data dependency in C删除 C 中的数据依赖项
【发布时间】:2016-01-03 05:17:40
【问题描述】:

我有一个具有数据依赖性的代码。

代码示例:

int data[1000*3];
int result[1000]={0,};

// initialize data[]

for(i=0; i<1000; i++)
{
   a = data[i*3 + 0];
   b = data[i*3 + 1];
   c = data[i*3 + 2];

   if( (a>b) && (a>c) )   // This line makes data dependency
      result[i]++;
}

我想删除数据依赖性以并行化此代码。 我知道我必须编辑我的代码,但不知道如何修复它。

我该如何修复此代码?

【问题讨论】:

  • 我没有看到数据依赖关系,但是当您在方括号内进行数学索引时,有时编译器会感到困惑。只要您将 a、b 和 c 私有化,这应该是可并行的。由于您使用 openacc 标记了它,如果编译器告诉您由于数据依赖性而无法并行化,我建议使用 acc parallel loop 而不是 acc kernels
  • 实际上,我从另一个类似的代码中发现了数据依赖性(使用 NVVP)。但是作为这个示例代码,NVVP 并没有告诉我这会导致数据依赖。我认为我的真实代码的依赖是由其他原因引起的。我会尝试寻找其他原因。谢谢你的帮助,杰夫。 :)
  • 要查找的两件事:1) 如果您正在访问多个数组,请确保将指针声明为restrict,以便编译器知道它们没有别名。 2)方括号内的索引数学。

标签: c parallel-processing dependencies openacc


【解决方案1】:

试试:

int data[1000*3];
int result[1000]={0,};

// initialize data[]

for(i=0; i<1000; i++)
{
   if( (data[i*3 + 0] > data[i*3 + 1]) && (data[i*3 + 0] > data[i*3 + 2]) )   
      result[i]++;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2019-11-13
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多