cuda“;需要一个类型说明符";

cuda“;需要一个类型说明符";,cuda,gpgpu,nvidia,Cuda,Gpgpu,Nvidia,我在第10行\uuuu global\uuuu.void kernel中遇到错误。我一定是做错了什么? 这是我的代码: #include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> #include <time.h> #define F 20 __global__ void kernel(do

我在第10行
\uuuu global\uuuu.void kernel
中遇到错误。我一定是做错了什么? 这是我的代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <time.h>

#define F 20

__global__ void kernel(double* dev_fitness,double* dev_prob, F)
{
    int i = blockIdx.x;
    double maxfit;
    maxfit=dev_fitness[0];
    if(i<F)
    {
        if(dev_fitness[i]>maxfit)
            maxfit=dev_fitness[i];
    }
    if(i<F)
    {
        dev_prob[i]=(0.9*(dev_fitness[i]/maxfit))+0.1;
    }
}

double prob[F];
double fitness[F];
int main()
{   
    double* dev_fitness;
    size_t fitnessSize= F*sizeof(double);
    cudaMalloc(&dev_fitness,fitnessSize);
    cudaMemcpy(dev_fitness,fitness,fitnessSize,cudaMemcpyHostToDevice);
    //--------------
    double* dev_prob;
    size_t probSize=F*sizeof(double);
    cudaMalloc(&dev_prob,probSize);
    cudaMemcpy(dev_prob,prob,probSize,cudaMemcpyHostToDevice);

            kernel <<<F,1>>> (dev_fitness,dev_prob,F);
            cudaMemcpy (fitness,dev_fitness,fitnessSize,cudaMemcpyDeviceToHost);
            cudaMemcpy (prob,dev_prob,probSize,cudaMemcpyDeviceToHost);
            cudaFree (dev_fitness);
            cudaFree (dev_prob);
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义F20
__全局无效内核(双*dev\u适应度,双*dev\u prob,F)
{
int i=块idx.x;
双最大拟合;
maxfit=dev_fitness[0];
if(imaxfit)
maxfit=dev_fitness[i];
}
如果(i)
您正试图将文字(宏
F
扩展为
20
)作为函数参数传递,即:

这是不正确的。请记住,宏是在编译代码之前发生的基本文本查找和替换

事实上,您不应在参数列表中放置任何表达式

幸运的是,宏在整个文件中已经可以全局访问,因此根本不需要将其传递到函数中

也就是说,简单地写下:

  __global__ void kernel(double* dev_fitness,double* dev_prob)
使用
#define
时,宏会按字面展开:

#define F 20
__global__ void kernel(double* dev_fitness,double* dev_prob, F) {
进入:

__global__ void kernel(double* dev_fitness,double* dev_prob, 20) {
但是,您当然不能在函数声明中使用
20
! 所以

  • 根本不要使用该参数:

    \uuuu全局\uuuuu无效内核(双*dev\u适应度,双*dev\u prob)
    代码将起作用,因为宏(因此,
    F
    )是全局可见的(它们在编译之前经过预处理)

  • 将该参数更改为适当的变量:

    \uuuu全局\uuuuu无效内核(双*dev\u适应度,双*dev\u prob,双Fparam)
    以及使用Fparam的函数内部的代码

    然后,您可以调用
    kernel
    提供
    F
    作为最后一个参数

  • #define F 20
    __global__ void kernel(double* dev_fitness,double* dev_prob, F) {
    
    __global__ void kernel(double* dev_fitness,double* dev_prob, 20) {