#include <algorithm>
#include <vector>
template <typename Dtype>
__global__ void R_D_CUT(const int n, Dtype* r, Dtype* d
, Dtype cur_r_max, Dtype cur_r_min, Dtype cur_d_max, Dtype cur_d_min) {
CUDA_KERNEL_LOOP(index, n) {
r[index] = __min(cur_r_max, __max(r[index], cur_r_min));
d[index] = __min(cur_d_max, __max(d[index], cur_d_min));
}
}
在上面的代碼中,它可以在Window中很好地工作。但是,由於__min
和__max
函數,它在Ubuntu中不起作用。要修復它通過更換__min
到std::min<Dtype>
和max
到std::max<Dtype>
:CUDA中不允許如何修復調用__host__函數的錯誤(「std :: max <double>」)?
template <typename Dtype>
__global__ void R_D_CUT(const int n, Dtype* r, Dtype* d
, Dtype cur_r_max, Dtype cur_r_min, Dtype cur_d_max, Dtype cur_d_min) {
CUDA_KERNEL_LOOP(index, n) {
r[index] = std::min<Dtype>(cur_r_max, std::max<Dtype>(r[index], cur_r_min));
d[index] = std::min<Dtype>(cur_d_max, std::max<Dtype>(d[index], cur_d_min));
}
}
然而,當我重新編譯,我得到了錯誤
_layer.cu(7): error: calling a __host__ function("std::min<float> ") from a __global__ function("caffe::R_D_CUT<float> ") is not allowed
_layer.cu(7): error: calling a __host__ function("std::max<float> ") from a __global__ function("caffe::R_D_CUT<float> ") is not allowed
_layer_layer.cu(8): error: calling a __host__ function("std::min<float> ") from a __global__ function("caffe::R_D_CUT<float> ") is not allowed
_layer_layer.cu(8): error: calling a __host__ function("std::max<float> ") from a __global__ function("caffe::R_D_CUT<float> ") is not allowed
_layer_layer.cu(7): error: calling a __host__ function("std::min<double> ") from a __global__ function("caffe::R_D_CUT<double> ") is not allowed
_layer_layer.cu(7): error: calling a __host__ function("std::max<double> ") from a __global__ function("caffe::R_D_CUT<double> ") is not allowed
_layer_layer.cu(8): error: calling a __host__ function("std::min<double> ") from a __global__ function("caffe::R_D_CUT<double> ") is not allowed
_layer_layer.cu(8): error: calling a __host__ function("std::max<double> ") from a __global__ function("caffe::R_D_CUT<double> ") is not allowed
你能幫我解決嗎?謝謝
我的'分鐘相當肯定CUDA已經模板版本()'和'MAX()'。或者至少是超載的。 – njuffa
謝謝。它運作良好。我還有一個問題。在非CPU代碼(.CPP文件)的情況下,我也需要使用上面的max和min函數,但是當我使用你的方式時,在這裏聲明'_layer.cpp:205:25:錯誤:'max' ,稍後在翻譯單元中。我們是否需要更改.cpp版本 – user8264
我可能需要查看特定示例。您可能想問一個新問題,我認爲這與CUDA無關。你是在聲明你自己的'max'的定義嗎?無論如何,我不清楚你所展示的實際上是一個錯誤。 –