首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指定gencode时对CUB ReduceByKey的错误结果

指定gencode时对CUB ReduceByKey的错误结果
EN

Stack Overflow用户
提问于 2017-04-05 18:22:36
回答 1查看 272关注 0票数 0

在我的一个项目中,我看到了一些不正确的结果,当使用幼崽的DeviceReduce::ReduceByKey时。但是,在thrust::reduce_by_key中使用相同的输入/输出会产生预期的结果。

代码语言:javascript
复制
#include "cub/cub.cuh"

#include <vector>
#include <iostream>

#include <cuda.h>

struct AddFunctor {
  __host__ __device__ __forceinline__
  float operator()(const float & a, const float & b) const {
    return a + b;
  }
} reduction_op;

int main() {

  int n = 7680;

  std::vector < uint64_t > keys_h(n);
  for (int i =    0; i < 4000; i++) keys_h[i] = 1;
  for (int i = 4000; i < 5000; i++) keys_h[i] = 2;
  for (int i = 5000; i < 7680; i++) keys_h[i] = 3;

  uint64_t * keys;
  cudaMalloc(&keys, sizeof(uint64_t) * n);
  cudaMemcpy(keys, &keys_h[0], sizeof(uint64_t) * n, cudaMemcpyDefault);

  uint64_t * unique_keys;
  cudaMalloc(&unique_keys, sizeof(uint64_t) * n);

  std::vector < float > values_h(n);
  for (int i = 0; i < n; i++) values_h[i] = 1.0;

  float * values;
  cudaMalloc(&values, sizeof(float) * n);
  cudaMemcpy(values, &values_h[0], sizeof(float) * n, cudaMemcpyDefault);

  float * aggregates;
  cudaMalloc(&aggregates, sizeof(float) * n);

  int * remaining;
  cudaMalloc(&remaining, sizeof(int));

  size_t size = 0;
  void * buffer = NULL; 

  cub::DeviceReduce::ReduceByKey(
    buffer,
    size,
    keys,
    unique_keys,
    values,
    aggregates,
    remaining,
    reduction_op,
    n);

  cudaMalloc(&buffer, sizeof(char) * size);

  cub::DeviceReduce::ReduceByKey(
    buffer,
    size,
    keys,
    unique_keys,
    values,
    aggregates,
    remaining,
    reduction_op,
    n);

  int remaining_h;
  cudaMemcpy(&remaining_h, remaining, sizeof(int), cudaMemcpyDefault);

  std::vector < float > aggregates_h(remaining_h);
  cudaMemcpy(&aggregates_h[0], aggregates, sizeof(float) * remaining_h, cudaMemcpyDefault);

  for (int i = 0; i < remaining_h; i++) {
    std::cout << i << ", " << aggregates_h[i] << std::endl;
  }

  cudaFree(buffer);
  cudaFree(keys);
  cudaFree(unique_keys);
  cudaFree(values);
  cudaFree(aggregates);
  cudaFree(remaining);

}

当我包含"-gencode arch=compute_35,code=sm_35“(对于开普勒GTX泰坦)时,它会产生错误的结果,但是当我完全忽略这些标志时,它就会工作。

代码语言:javascript
复制
$ nvcc cub_test.cu
$ ./a.out
0, 4000
1, 1000
2, 2680
$ nvcc cub_test.cu -gencode arch=compute_35,code=sm_35
$ ./a.out
0, 4000
1, 1000
2, 768

我用了几个其他的幼崽呼叫没有问题,只是这一个是错误的行为。我还尝试在GTX1080Ti(使用compute_61,sm_61)上运行这段代码,并看到了相同的行为。

省略这些编译器标志是正确的解决方案吗?

在一台机器上试用:

  • 库达8.0
  • ubuntu 16.04
  • gcc 5.4.0
  • 幼崽1.6.4
  • 开普勒GTX土卫六(计算能力3.5)

另一个有:

  • 库达8.0
  • ubuntu 16.04
  • gcc 5.4.0
  • 幼崽1.6.4
  • Pascal GTX 1080 Ti (计算能力6.1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-05 18:27:38

听起来你应该在CUB存储库问题页上提交一个错误报告。

编辑:我可以复制这个问题:

代码语言:javascript
复制
[joeuser@myhost:/tmp]$ nvcc -I/opt/cub -o a a.cu
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
[joeuser@myhost:/tmp]$ ./a
0, 4000
1, 1000
2, 2680
[joeuser@myhost:/tmp]$ nvcc -I/opt/cub -o a a.cu -gencode arch=compute_30,code=sm_30
[joeuser@myhost:/tmp]$ ./a
0, 4000
1, 1000
2, 512

相关信息:

  • 库达: 8.0.61
  • nVIDIA驱动程序: 375.39
  • 发行版: GNU/Linux 18.1
  • Linux内核: 4.4.0
  • GCC: 5.4.0-6ubuntu1~16.04.4
  • 幼崽: 1.6.4
  • GPU: GTX 650 Ti (计算能力3.0)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43238851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档