cuda“期望一个类型说明符”

时间:2013-02-16 15:20:19

标签: cuda gpgpu nvidia

我在第10行__global__ 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);
}

2 个答案:

答案 0 :(得分:4)

__global__ void kernel(double* dev_fitness,double* dev_prob, F)
//                                                         ^^^

您试图将文字(宏F扩展为20)作为函数参数传递,即:

__global__ void kernel(double* dev_fitness,double* dev_prob, 20)

这是不正确的。回想一下,宏是在编译代码之前发生的基本文本查找和替换。

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

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

即,只需写下:

  __global__ void kernel(double* dev_fitness,double* dev_prob)

答案 1 :(得分:3)

当您使用#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! 所以要么

  1. 根本不要使用该参数:

    __global__ void kernel(double* dev_fitness,double* dev_prob) 代码将起作用,因为宏(因此,F)是全局可见的(在编译之前它们 pre -processed)。

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

    __global__ void kernel(double* dev_fitness,double* dev_prob, double Fparam) 并且函数里面的代码可以使用Fparam。

    然后,您可以拨打kernel提供F作为最后一个参数。