我在第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);
}
答案 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
!
所以要么
根本不要使用该参数:
__global__ void kernel(double* dev_fitness,double* dev_prob)
代码将起作用,因为宏(因此,F
)是全局可见的(在编译之前它们 pre -processed)。
将该参数更改为适当的变量:
__global__ void kernel(double* dev_fitness,double* dev_prob, double Fparam)
并且函数里面的代码可以使用Fparam。
然后,您可以拨打kernel
提供F
作为最后一个参数。