2013-02-16 69 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