C++ C++;-试图使两点的值相等时产生错误:表达式必须具有算术或枚举类型
当我尝试使用nvcc-c编译my.cu文件时,出现以下错误: mag_cuda.cu(213):错误:表达式必须具有算术或枚举类型 此处给出的GPU将执行的功能的一部分,有问题的行:C++ C++;-试图使两点的值相等时产生错误:表达式必须具有算术或枚举类型,c++,pointers,types,cuda,C++,Pointers,Types,Cuda,当我尝试使用nvcc-c编译my.cu文件时,出现以下错误: mag_cuda.cu(213):错误:表达式必须具有算术或枚举类型 此处给出的GPU将执行的功能的一部分,有问题的行: __global__// all kernels are preceded by __global__ keyword void sum_all_indv_B(int No_poles, double *B_x, double *B_y, double *B_z, double *indv_B[][3])
__global__// all kernels are preceded by __global__ keyword
void sum_all_indv_B(int No_poles, double *B_x, double *B_y, double
*B_z, double *indv_B[][3])
{
// determine thread ID within block
int index = blockIdx.x * blockDim.x + threadIdx.x;
// determine stride of loop (more elements in array than threads)
int stride = blockDim.x * gridDim.x;
//loop over all the poles
for(int counter_1 = index; counter_1 < No_poles; counter_1+=stride)
{
//sum the B field contribution from all poles in x,y and z directions
B_x += indv_B[counter_1][0];
B_y += indv_B[counter_1][1];
B_z += indv_B[counter_1][2];
//Divide total by number of Poles
B_x = B_x/No_poles;
B_y = B_y/No_poles;
B_z = B_z/No_poles;
}
}
\uuuuu global\uuuu//
无效和(整数无极点,双*B\x,双*B\y,双
*B_z,双*indv_B[][3])
{
//确定块内的线程ID
int index=blockIdx.x*blockDim.x+threadIdx.x;
//确定循环的步长(数组中的元素多于线程)
int stride=blockDim.x*gridDim.x;
//绕着所有的杆子转
对于(int counter_1=索引;counter_1<无极点;counter_1+=步幅)
{
//求x、y和z方向上所有极点的B场贡献之和
B_x+=indv_B[计数器1][0];
B_y+=indv_B[计数器1][1];
B_z+=indv_B[计数器1][2];
//将总数除以极数
B_x=B_x/无极;
B_y=B_y/无极;
B_z=B_z/无极点;
}
}
错误发生在“B_x+=indv_B[计数器1][0];”、“B_x=B_x/无_极点”和类似线路上
任何想法,因为我没有太多的指针
B_x
和indv_B[I][j]
都是指向双值的指针。假设声明double*B_x
和double*indv_B[][3]
正确,使用*B_x+=*indv_B[counter_1][0]代码>
您还必须更改以下行:*B_x=*B_x/No_x
indv_B[i][j]
是指向双精度的指针。假设声明double*indv_B[][3]
正确,使用B_x+=*indv_B[counter_1][0]代码>这试图添加两个指针:B_x+=indv_B[counter_1][0]代码>。也许你想要的是:*B_x+=*indv_B[counter_1][0]
和其他两个类似,以及*B_x=*B_x/No_极点代码>,其他两个也一样。@RobertCrovella添加*有效。非常感谢您的帮助B_x
也是指向double
的指针。因此,将double
数量添加到指向double
的指针没有任何意义。这不会解决任何问题。@Gilles PhilippePaillé我现在刚试过,它抛出了另一个错误message@Aaron无论您在哪里使用B_x
,都必须执行相同的操作。我将编辑答案。@Gilles PhilippePaillé是的,这确实解决了问题。非常感谢。