C++ CUDA:重新索引阵列

C++ CUDA:重新索引阵列,c++,arrays,cuda,indexing,C++,Arrays,Cuda,Indexing,在本例中,我有3个浮点数组,查询点[]、初始数组[]和最终数组[]。查询_points[]中的值向下舍入并成为索引值,我想将初始_数组[]中这些索引处的数据复制到结果_数组[] 我的问题是每几百个值,与正确工作的C++代码相比,我得到的值不同。我是CUDA的新手,不知道发生了什么。请让我知道,如果你能告诉我一个解决方案。谢谢 CUDA代码: int w = blockIdx.x * blockDim.x + threadIdx.x; // Col // width int h = blockId

在本例中,我有3个浮点数组,查询点[]、初始数组[]和最终数组[]。查询_points[]中的值向下舍入并成为索引值,我想将初始_数组[]中这些索引处的数据复制到结果_数组[]

我的问题是每几百个值,与正确工作的C++代码相比,我得到的值不同。我是CUDA的新手,不知道发生了什么。请让我知道,如果你能告诉我一个解决方案。谢谢

CUDA代码:

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];
}

我没有编写代码来测试它,但我可以看到两个问题:

如果您正在使用地板浮子,请使用地板浮子功能。我不认为这是原因,但这显然是更好的方法。 我能看到的主要问题是更微妙的,或者我只是在猜测:地板和地板返回浮动和双分别。因此,当您这样做时:

楼层查询点[索引]-1

你所拥有的仍然是一个浮点数,由于精度损失,它可能小于你应该得到的实际积分值。当您通过将其隐式转换为整数

int piece = floor(query_points[index]) - 1;
基本上,你把小数部分截断,得到n-1,你认为得到的是n

即使没有这种分析

int piece = floor(query_points[index]) - 1;

在这一行中,您是地板和而不是截断,这本质上是同一件事,因此您甚至不需要使用地板或地板。

您在自己的评论中给出了答案:我还认为这可能与我将相同的输入和输出数组传递到函数中,试图执行就地操作有关

您对症状的描述—它只是偶尔发生,而且只在大型阵列上重新出现—也符合解释


请注意,如果您想要完全并发,并不总是能够防止竞争条件——您可能必须使用单独的输入和输出数组。在处理过程中,合并排序和基数排序都是中间数组之间的乒乓。我认为没有人能够在没有辅助空间的情况下实现这些算法。

请提供一个简短、完整的可编译代码,以说明问题/不匹配。因此,需要这样做:寻求调试帮助的问题为什么这段代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。您是否使用cuda memcheck运行代码?@RobertCrovella我不知道如何创建一个最小的示例,因为它需要大量数组才能发生错误。代码在最小数组上运行良好。Cuda memcheck显示0个错误。奇怪的是,在我重新启动系统后,这个问题就停止了,现在似乎工作正常,尽管我仍然怀疑它的可靠性。我还认为这可能与我将相同的输入和输出数组传递到函数中,试图执行就地操作有关。我还认为这可能与我将相同的输入和输出数组传递到函数中,试图执行就地操作有关。是的,这可能是一个问题,从您发布的代码或您的问题/描述中根本看不出这一点,这显然让人觉得3个数组是不同的。提供一个完整的代码可以澄清您实际上是在原地做事。如果您不能/不愿意提供完整的代码,那么您的问题只会引发很多猜测,在我看来,这并不适合。对于x的哪些值,floorx返回的值小于您应该得到的实际整数值?或者,如果愿意,使用给定的代码行int-piece=floorquery_points[index]-1;,您能否为右侧的变量提供任何数值,以说明由于精度损失而得到的值小于实际积分值?地板返回双倍数量。可以用双精度表示的整数范围大于可以用int表示的整数范围。感谢您的输入,如果我看到问题再次出现,我将调整代码以使用floorf并尝试转换为int。我不确定这是否是主要问题,因为代码可能对500个条目有正确的值,然后对大约100个条目有错误的值,虽然不完全是规则的,但或多或少在该模式中重复。