0

我在第 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);
}
4

2 回答 2

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)
于 2013-02-16T15:40:48.687 回答
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)是全局可见的(它们在编译之前进行了预处理)。

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

    __global__ void kernel(double* dev_fitness,double* dev_prob, double Fparam) 以及函数内部的代码使用Fparam。

    然后,您可以将kernelsupplyingF作为最后一个参数调用。

于 2013-02-16T15:41:09.207 回答