CUDA:重新索引数组
CUDA: reindexing arrays
在这个例子中,我有3个浮点数组,query_points[], initial_array[]和final_array[]。query_points[]中的值被四舍五入并成为索引值,我想将initial_array[]中那些索引处的数据复制到result_array[]。
我遇到的问题是每几百个值,与正常工作的c++代码相比,我得到不同的值。我是CUDA的新手,不知道发生了什么。请让我知道,如果你能指出我对一个解决方案。谢谢!
CUDA Code:
int w = blockIdx.x * blockDim.x + threadIdx.x; // Col // width
int h = blockIdx.y * blockDim.y + threadIdx.y; // Row // height
int index = h*width+w;
if ((w < width) && (h < height)){
int piece = floor(query_points[index]) - 1;
int piece_index = h*width+piece;
result_array[index] = initial_array[piece_index];
}
您在自己的评论中给出了答案:"我也认为这可能与我将相同的输入和输出数组传递到函数中这一事实有关,试图做一个适当的操作。"
您对该症状的描述(它只偶尔发生,并且只在大数组上重现)也符合解释。
请注意,如果您想要完全并发,则不可能总是防止竞争条件—您可能必须使用单独的输入和输出数组。合并排序和基数排序在处理过程中会在中间数组之间来回切换。我不认为有人想出了如何在没有O(N)辅助空间的情况下实现这些算法。
我没有写代码来测试它,但有两个问题,我可以看到:
- 如果你是地板浮动比使用floorf()函数。我不认为这是原因,但这显然是更好的方法。
-
我能看到的主要问题是微妙的,或者我只是猜测:floor()和floorf()分别返回float和double。所以,当你这样做的时候:
你得到的仍然是一个浮点数,可能比你应该得到的实际整数值要小,因为精度损失。当您通过
将其隐式转换为整数时int piece = floor(query_points[index]) - 1;
就是截断小数部分,得到n-1,你认为你得到的是n。
即使没有这个分析
int piece = floor(query_points[index]) - 1;
在这一行中,您是地板和截断,这在本质上是一样的,所以您甚至不需要使用floor()或floorf()。
相关文章:
- 特征获取索引数组,其中向量中的值为真(不需要循环)
- 是否可以使用字符串或字符索引数组
- 为什么在使用字符索引数组时会出现这种不同的行为
- 在具有重复索引的索引数组处更改 ArrayFire 数组
- 使用索引数组订购 ArrayFire Array 的最佳方式
- C++ 中结构的动态索引数组
- 1索引数组上的qsort()正在扰乱索引
- C++ 索引数组打印和删除字符串名称 数组打印
- 字符串下标超出范围.我不知道如何使用字符索引数组,所以我使用了(无符号整数),但它不起作用
- openGL drawElements - 一个额外的三角形,使用索引数组
- 具有索引数组的地形(高度贴图)LOD
- 通过创建索引数组进行 C++ 排序
- OpenGL:两个顶点数组 + 两个索引数组
- 将索引数组排序为主数组
- 自动循环跳过某些索引数组
- 为静态强制转换的索引数组生成数组
- 重载枚举索引数组的std::get
- 使用c++中的第二个索引数组对数组进行排序
- 给定的零索引数组 &该数组的均衡索引
- CUDA:重新索引数组