Cuda 推力::独特的按键消耗最后一个元素 请考虑下面的简单代码: thrust::device_vector<int> positions(6); thrust::sequence(positions.begin(), positions.end()); thrust::pair<thrust::device_vector<int>::iterator, thrust::device_vector<int>::iterator > end; //copyListOfNgramCounteachdoc contains: 0,1,1,1,1,3 end.first = copyListOfNgramCounteachdoc.begin(); end.second = positions.begin(); for(int i =0 ; i < numDocs; i++){ end= thrust::unique_by_key(end.first, end.first + 3,end.second); } int length = end.first - copyListOfNgramCounteachdoc.begin() ; cout<<"the value of end -s is: "<<length; for(int i =0 ; i< length ; i++){ cout<<copyListOfNgramCounteachdoc[i]; }

Cuda 推力::独特的按键消耗最后一个元素 请考虑下面的简单代码: thrust::device_vector<int> positions(6); thrust::sequence(positions.begin(), positions.end()); thrust::pair<thrust::device_vector<int>::iterator, thrust::device_vector<int>::iterator > end; //copyListOfNgramCounteachdoc contains: 0,1,1,1,1,3 end.first = copyListOfNgramCounteachdoc.begin(); end.second = positions.begin(); for(int i =0 ; i < numDocs; i++){ end= thrust::unique_by_key(end.first, end.first + 3,end.second); } int length = end.first - copyListOfNgramCounteachdoc.begin() ; cout<<"the value of end -s is: "<<length; for(int i =0 ; i< length ; i++){ cout<<copyListOfNgramCounteachdoc[i]; },cuda,gpu,thrust,Cuda,Gpu,Thrust,我认为在这种情况下,您希望使用的是asch::unique\u by\u key\u copy,但请继续阅读 问题在于,unique\u by_key不会更新输入数组,除非它必须更新。在第一次调用的情况下,它可以通过删除重复的1——向前移动返回的迭代器,而不实际压缩输入数组来返回一系列唯一键 如果将循环替换为以下循环,您可以看到发生了什么: end.first = copyListOfNgramCounteachdoc.begin(); end.second = positions.begin(

我认为在这种情况下,您希望使用的是
asch::unique\u by\u key\u copy
,但请继续阅读

问题在于,
unique\u by_key
不会更新输入数组,除非它必须更新。在第一次调用的情况下,它可以通过删除重复的
1
——向前移动返回的迭代器,而不实际压缩输入数组来返回一系列唯一键

如果将循环替换为以下循环,您可以看到发生了什么:

end.first = copyListOfNgramCounteachdoc.begin();
end.second = positions.begin();
thrust::device_vector<int>::iterator iter;

for(int i =0 ; i < numDocs; i++){
  cout <<"before ";
  for(iter = end.first; iter != end.first+3; iter++) cout<<*iter;

  end = thrust::unique_by_key(end.first, end.first + 3,end.second);

  cout <<" after ";
  for(iter = copyListOfNgramCounteachdoc.begin(); iter != end.first; iter++) cout<<*iter;
  cout << endl;

  for(int i =0 ; i< 6; i++) cout<<copyListOfNgramCounteachdoc[i];
  cout << endl;
}
您可以看到,
copylistOfGramCounteAchDoc
中的值没有改变。这是有效的行为。如果您使用了
unique\u by\u key\u copy
而不是
unique\u by\u key
,那么为了保证唯一性,推力将被迫实际压缩值,但在这种情况下,由于每个序列中只有两个值,因此不需要。文件说:

返回值是一个迭代器new_last,使得范围[first,new_last]中的两个连续元素不相等[new_last,last]仍然是可取消引用的,但它们指向的元素未指定。unique是稳定的,这意味着未删除的元素的相对顺序不变

如果您使用
unique\u by\u key\u copy
,则推力将被迫复制唯一键和值(具有明显的成本影响),您应该会看到您期望的行为


顺便说一句,如果你可以在一次调用
unique\u by\u key
中完成这项操作,而不是在循环中完成,我建议你这样做。

我认为在这种情况下你想要使用的是
推力::unique\u by\u key\u copy
,但请继续阅读

问题是除非必须更新输入数组,
unique\u by\u key
不会更新输入数组。在第一次调用的情况下,它可以通过删除重复的
1
——将返回的迭代器向前移动,而不实际压缩输入数组,来返回一系列唯一的键

如果将循环替换为以下循环,您可以看到发生了什么:

end.first = copyListOfNgramCounteachdoc.begin();
end.second = positions.begin();
thrust::device_vector<int>::iterator iter;

for(int i =0 ; i < numDocs; i++){
  cout <<"before ";
  for(iter = end.first; iter != end.first+3; iter++) cout<<*iter;

  end = thrust::unique_by_key(end.first, end.first + 3,end.second);

  cout <<" after ";
  for(iter = copyListOfNgramCounteachdoc.begin(); iter != end.first; iter++) cout<<*iter;
  cout << endl;

  for(int i =0 ; i< 6; i++) cout<<copyListOfNgramCounteachdoc[i];
  cout << endl;
}
您可以看到,
copylistOfGramCounteAchDoc
中的值没有改变。这是一种有效的行为。如果您使用的是
unique\u by\u key\u copy
而不是
unique\u by\u key
,那么为了保证唯一性,推力将被迫实际压缩这些值,但在这种情况下,因为只有两个值在每个序列中,都没有必要。文档说:

返回值是一个迭代器new_last,使得范围[first,new_last]中的两个连续元素不相等[new_last,last]仍然是可取消引用的,但它们指向的元素未指定。unique是稳定的,这意味着未删除的元素的相对顺序不变

如果您使用
unique\u by\u key\u copy
,则推力将被迫复制唯一键和值(具有明显的成本影响),您应该会看到您期望的行为


顺便说一句,如果你可以通过一次调用
unique\u by\u key
而不是在循环中执行,我建议你这样做。

end.first+3
必须指向last之后的元素。我想你应该通过
end.first+4
为什么
unique\u by\u key
只有3个输入时会有4个输出?@talonmies:如果你注意到,我不是对整个数组执行unique by_key。我是对数组中的子序列执行unique by key。首先,我将它应用于0,1,1,这应该给我0,1作为输出。然后,我将它应用于1,1,3,这应该给我1,3作为输出。因此,我预计总共4个输出,因为for循环将执行两次
end.first+3
必须指向最后一个之后的元素。我想你应该通过
end.first+4
当它只有3个输入时,为什么会有4个
unique\U by\U key
的输出?@TALLONMIES:如果你注意到了,我不是在整个数组上执行unique\U by\U key。我是在数组中的子序列上执行unique by by key将其应用于0,1,1,这将给我0,1作为输出。然后,我将其应用于1,1,3,这将给我1,3作为输出。因此,我预计for循环将执行总共4个输出。我希望在一次调用中执行这一操作。但正如您所观察到的,我必须对数组的压缩部分进行流式处理。我不希望将数组压缩为流式处理一个整体。有什么办法吗?我想我已经解释过了:使用多个调用unique_by_key_copy。你必须加倍缓冲数据才能这样做。我已经将我的问题编辑为使用unique_by_key_copy。但这并不能消除循环。你也说过“如果您执行了唯一的\u by \u键,那么为了保证唯一性,推力将被迫实际压缩值,”您是说唯一的\u by \u键\u复制错误已更正。您没有问如何删除循环。您是问的”我希望此代码的输出为0,1,1,3;但是,输出为0,1,1。有人能告诉我缺少什么吗?"我相信我已经回答了为什么输出不是您期望的结果的问题。我很想在一次调用中实现这一点。但正如您所观察到的,我必须对阵列的压缩部分进行流式处理。我不想对整个阵列进行流式处理压缩。有什么方法可以做到这一点吗?我想我已经解释过:使用多个调用来对unique_by_key_copy进行操作。您必须为此,请对数据进行双缓冲。我已将问题编辑为使用unique_by_key_copy。但这仍然不会删除循环。此外,您还说“如果您使用unique_by_key,则为了保证唯一性,推力将被迫实际压缩值。”你的意思是“唯一的”\u by\u key\u copytopo已更正。你没有问如何删除循环。你问“我期望此代码的输出为0,1,1,3;但是,输出为0,1,1。有人能告诉我我缺少了什么吗?”我相信我知道
before 011 after 01
011223
before 122 after 0112
011223