3
#include <cuda.h>
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
using namespace std;

__global__ void kernel(vector <int> *a,vector <int> *b, vector <int> *c)
{
    int index=threadIdx.x;
    c[index]=a[index]+b[index];
};

int main ()
{
    //Paar constanten initializeren
    int N=3;
    vector <int> a (3,1);
    vector <int> b (3,1);
    vector <int> c (3,0);
    int size=N*sizeof(vector <int>);
    //Device variabelen
    vector <int> d_a;
    vector <int> d_b;
    vector <int> d_c;

    //<size> bytes device-geheugen vrijmaken op locatie &a
    cudaMalloc( (void **) &a, size);
    cudaMalloc ( (void **) &b, size);
    cudaMalloc ( (void **) &c, size);

    //Kopieer inputs van &a naar &d_a
    cudaMemcpy(&d_a,&a,size,cudaMemcpyHostToDevice);
    cudaMemcpy(&d_b,&b,size,cudaMemcpyHostToDevice);

    printf( (char *) a[1]);
    printf( (char *) c[1]);
    //Voer kernel uit

    kernel<<<N,1>>>(&d_a,&d_b,&d_c);

    //Kopieer resultaat terug naar host 
    cudaMemcpy(&c,&d_c,size,cudaMemcpyDeviceToHost);

    printf( (char *) c[1]);

    return 0;
};

したがって、これは私の基本的な C++ ベクトル加算プログラムですが、インデックスを追加するときに「+」をどう処理するかわからないためコンパイルされません (「これらのオペランドに一致する演算子「+」はありません」)。これがカーネル内で機能しない理由を知っている人はいますか? その問題を回避する方法はわかりませんが、それがホスト関数またはそのようなものであるという事実に関係している可能性があると思います。

よろしくお願いします。

4

1 に答える 1

4

デバイスコードで STL を使用することはできません...配列またはThrust Libraryのような他の CUDA コンストラクトを使用する必要があります。

于 2012-10-21T22:03:06.713 に答える