我一直在 cuda 中寻找模板化数学函数,但似乎找不到。在普通的 C++ 中,如果我调用std::sqrt它是模板化的,并且将根据参数是浮点数还是双精度数来执行不同的版本。
我想要这样的 CUDA 设备代码。我的内核将真实类型作为模板参数传递,现在我必须在使用sqrtffloat 和sqrtdouble之间进行选择。我认为推力可能具有此功能,但它仅适用于复数。
问题或多或少都说明了一切.
calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed
Run Code Online (Sandbox Code Playgroud)
从我的理解,这应该是使用cuda pow功能,但事实并非如此.
我试图在__global__函数中使用数学函数(pow),但是我得到了这个错误:
calling a __host__ function("std::pow<float, double> ") from a __global__ function is not allowed
Run Code Online (Sandbox Code Playgroud)
我试图检查项目属性下的"使用快速数学库"复选框 - >构建 - >设置 - >工具设置 - >优化,没有运气.
我检查了pow函数内部的类型,两者都是浮点数,我还包括这些头文件:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <math.h>
#include <sys/times.h>
#include <sys/resource.h>
#include <limits.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include "utils.h"
Run Code Online (Sandbox Code Playgroud)
也没有使用命名空间std
有想法该怎么解决这个吗?
我是CUDA的新手,无法理解我做错了什么.
我正在尝试计算它在数组中具有id的对象的距离,数组中的轴x和数组中的轴y以找到每个对象的邻居
__global__
void dist(int *id_d, int *x_d, int *y_d,
int *dist_dev, int dimBlock, int i)
{
int idx = threadIdx.x + blockIdx.x*blockDim.x;
while(idx < dimBlock){
int i;
for(i= 0; i< dimBlock; i++){
if (idx == i)continue;
dist_dev[idx] = pow(x_d[idx] - x_d[i], 2) + pow(y_d[idx] - y_d[i], 2); // error here
}
}
}
Run Code Online (Sandbox Code Playgroud)
是pow不是在内核代码中定义的?