-1

我正在处理 cuda 中的流体动力学问题并发现了这样的问题

如果我有一个数组,例如长度为 600 的 debug_array 和一个长度为 100 的数组 value_array 我想做某事

for(int i=0;i<6;i++)
{
   debug_array[6*(bx*block_size+tx)+i] = value_array[bx*block_size+tx];
}

在此示例中,block_size 将基于 100 个元素的数组,例如 4 个块 block_size 25

如果 value_array 包含例如 10;20;30;..... 我希望 debug_array 有 6 个类似值的组,例如 10;10;10;10;10;10;20;20;20;20;20;20 ;30......
问题是它没有从值数组中获取所有值,知道为什么这不起作用或一个好的解决方法。

如果我定义 float val = value_array[bx*block_size+tx]; 在 for 循环之外并将其保持在循环内 debug_array[bx*block_size+tx+i] = val;

但我想避免这种情况,因为我的内核在循环中有 5 到 10 个设备函数,这使得它很难阅读。

提前感谢任何建议

马库斯

4

2 回答 2

2

计算索引似乎有错误:

假设 debug_arraybx = 0tx = 0 的前 6 个元素将填充数据。

下一个线程::tx = 1元素 1 到 7 将填充数据(覆盖现有数据)。由于线程并行工作,因此无法确定首先调度哪个线程,因此无法确定哪些值将写入 debug_array。

你应该写:

 debug_array[6*(bx*block_size+tx)+i] = value_array[bx*block_size+tx];
于 2012-08-20T15:39:13.383 回答
0

如果更改代码以将 value_array 表达式移出循环并放入临时变量使代码工作 - 这是您所做的唯一代码更改 - 那么这闻起来像编译器错误。

尝试更改您的 nvcc 编译器选项以减少或禁用优化,并查看循环内的 value_array 表达式是否会改变行为。此外,请确保您使用的是最新的 CUDA 工具。

优化编译器通常会尝试将不依赖于循环索引变量的表达式移出循环,就像您的手动解决方法一样。它被称为“不变代码运动”,它通过减少循环的每次迭代中执行的代码量来加快循环速度。如果从循环中手动提取不变代码是可行的,但让编译器自己解决它却不行,那么就会对编译器产生怀疑。

于 2012-08-20T16:55:45.620 回答