1

我有一个与 ArrayFire 库和内存使用有关的问题。我用普通的 CUDA/C 实现了一些程序,并且使用 ArrayFire 实现了相同的程序,并且 CUDA/C 程序要快得多(比 ArrayFire 快 5 倍)。

我用它们检查了 Nvidia 分析器,我看到的主要区别是 memcpy 操作,在 ArrayFire 的情况下有很多 Memcpy 操作,而在其他情况下只有一些在程序的开头。做一些测试我发现做类似的事情:

f = f*q;

作为 f,q 数组会产生更多这样的 memcpy 调用......我认为这就是我的 ArrayFire 代码表现不佳的原因。为什么会这样?这些 Memcpys 从哪里来?我怎么能避免呢?***** // 编辑 //// 一段代码

void Adveccion(){
  for(int i = 0; i< q ; i++){
    f(span,span,span,i) = shift( f(span,span,span,i) , V[1][i] , V[0][i] , V[2][i] );
  }
}

f 是一个四维数组。我在其他 for 循环中有这个功能。如果我像这样修改函数:

void Adveccion(){
  for(int i = 0; i< q ; i++){
    shift( f(span,span,span,i) , V[1][i] , V[0][i] , V[2][i] );
  }
}

探查器没有显示 memcpys 的大量使用。认为我的问题是找到为数组分配新值的正确方法......也许使用 A = B,不是最好的,但我还有很多东西要学......

感谢您的关注,如果您需要更多代码来帮助我,请告诉我。谢谢 !

4

0 回答 0