2013-02-16 84 views
-2

我在第10行出现错误__global__ void kernel。我必须做错什么? 这是我的代码:cuda“预计类型说明符”

#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); 
} 

回答

3
__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) 
2

当您使用#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. 不要使用PARAM都:

    __global__ void kernel(double* dev_fitness,double* dev_prob) 的代码将工作,因为宏(因此,F)是全局可见的(他们是 -processed,前汇编)。

  2. 更改该参数去相应的变量:

    __global__ void kernel(double* dev_fitness,double* dev_prob, double Fparam) 和内部功能的代码,以使用Fparam的。

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

+0

好的,你的更好。 – 2013-02-16 15:41:52