当我尝试实现任何仿函数时,我得到不好的结果。例如,我尝试了类似于thrust::negate<T>的求反函子
以下是使用内建求反函子产生良好结果的示例代码:

int data[10] = {-5, 0, 2, -3, 2, 4, 0, -1, 2, 8};
int out[10];
thrust::negate<int> op;
thrust::transform(data, data + 10, out, op);


out变量变为{5, 0, -2, 3, -2, -4, 0, 1, -2, -8},但是当我实现自己的仿函数时

struct NegateFunctor{
__host__ __device__
    int operator()(const int &val) const {
        return -val;
}
};


并称其为thrust::transform(data, data + 10, out, NegateFunctor()) out包含{-858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460}

我在64位计算机上使用Visual Studio 2010 5.0 CUDA。

谢谢

最佳答案

如果我编译并运行您的代码(仅修改为添加thrust::transform调用结果的打印):

#include <thrust/transform.h>
#include <thrust/functional.h>

struct NegateFunctor{
    __host__ __device__
        int operator()(const int &val) const {
            return -val;
    }
};

int main(int argc, char** argv){
    int data[10] = {-5, 0, 2, -3, 2, 4, 0, -1, 2, 8};
    int out[10];
    //thrust::negate<int> op;
    thrust::transform(data, data + 10, out, NegateFunctor());
      for(int i=0; i<10; i++) {
        std::cout << data[i] << " " << out[i] << std::endl;
    }

    return 0;
}


我得到了这个(在OS 10.6.7上为CUDA 5.0):

$ nvcc thrust_neg2.cu
$ ./a.out
-5 5
0 0
2 -2
-3 3
2 -2
4 -4
0 0
-1 1
2 -2
8 -8


这似乎是正确的。如果您没有看到相同的结果,则可能是您使用的工具链有一个特定的问题,或者您没有告诉我们的其他原因导致了该问题。

编辑:并且它从您在调试模式下使用nvcc构建的注释中出现,这被认为不适用于Thrust。我只建议发布代码。如果问题仍然存在,则应该将其报告给Thrust开发人员,而不是Stack Overflow问题。

09-04 17:48