Cuda内核具有不同的数组大小

时间:2012-08-20 15:06:20

标签: cuda

我正在研究cuda的流体动力学问题并发现了像这样的问题

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

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个设备函数,这使得它很难阅读。

提前感谢任何建议都会得到满足

马库斯

2 个答案:

答案 0 :(得分:2)

计算索引时似乎有错误:

让我们假设bx = 0tx = 0 debug_array中的前6个元素将填充数据。

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

你应该写:

 debug_array[6*(bx*block_size+tx)+i] = value_array[bx*block_size+tx];

答案 1 :(得分:0)

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

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

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