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を利用する関数内のコード。

    次に、最後のパラメーターとしてkernel供給を呼び出すことができます。F

于 2013-02-16T15:41:09.207 に答える