0
__host__ void generateVector(int count) {

    A = new int[count];
    B = new int[count];

    for (int i = 0; i < count; i++) {
        A[i] = rand_from_0_to_100_gen();
        B[i] = rand_from_0_to_100_gen();
    }
}

CPU側で配列を作成し、この関数を使用してこれら2つの配列を合計しようとします:

__host__  void vectorSum(const int *dA, const int* dB, int count,  int* dC){

    cudaMalloc((void**) &dA, count * sizeof(int));
    cudaMalloc((void**) &dB, count * sizeof(int));


    cudaMemcpy(A, dA , count * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(B, dA , count * sizeof(int), cudaMemcpyHostToDevice);

    int tid = 0;

    while(tid < count){
        tid++;
        dC[tid] = dA[tid] + dB[tid];

    }

    cout << "C: {";
        for (int i = 0; i < count; i++) {
            cout << dC[i];
            cout << ",";
        }
        cout << "}";
}

この計算は GPU または CPU で行いますか? 私はそれについて疑います。

次に、この関数をメインで次のように呼び出します。

vectorSum(dA,dB,numOfData,dC);

しかし、値が設定される前に dC が使用されると言います。なんで?計算前に何を設定する必要がありますか。

コード全体:

using namespace std;
#include "cuda_runtime.h"
#include <thrust/host_vector.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>

int *A;
int *B;

int rand_from_0_to_100_gen(void) {
    return rand() % 100;
}

__host__ void generateVector(int count) {

    A = new int[count];
    B = new int[count];

    for (int i = 0; i < count; i++) {
        A[i] = rand_from_0_to_100_gen();
        B[i] = rand_from_0_to_100_gen();
    }
}

__host__ void displayVector(int count) {
    generateVector(count);

    cout << "A: {";
    for (int i = 0; i < count; i++) {
        cout << A[i];
        cout << ",";
    }
    cout << "}";


    cout << "\n";

    cout << "B: {";
    for (int i = 0; i < count; i++) {
        cout << B[i];
        cout << ",";
    }
    cout << "}";
}

__host__  void vectorSum(const int *dA, const int* dB, int count,  int* dC){

    cudaMalloc((void**) &dA, count * sizeof(int));
    cudaMalloc((void**) &dB, count * sizeof(int));


    cudaMemcpy(A, dA , count * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(B, dB , count * sizeof(int), cudaMemcpyHostToDevice);

    int tid = 0;

    while(tid < count){
        tid++;
        dC[tid] = dA[tid] + dB[tid];

    }


    cout << "C: {";
        for (int i = 0; i < count; i++) {
            cout << dC[i];
            cout << ",";
        }
        cout << "}";
}

__host__ void vectorDiff(const int *dA, const int* dB, int count, int* dC){



}



int main(void) {

    int dev, numOfData;
    const int *dA;
    const int *dB;
    int *dC;

    cudaGetDevice(&dev);
    cout << "Device with ID " << dev << " is defined\n";



    cout << "Please enter the number of data:";
    cin >> numOfData;
    displayVector(numOfData);
    vectorSum(dA,dB,numOfData,dC);

    return 0;
}
4

1 に答える 1

0

Nvidiaの例から始めることをお勧めします。ベクトルの加算を行う例があります。コードへの直接リンクはこちらです。

あなたのコードに関しては、あなたのコードに正しくないものについてのいくつかのポインタ。

Cuda を使用する場合はvectorSum、GPU で実行する必要がありますが、その前にプログラムを修正する必要があります。

vectorSumは Cuda のカーネル関数になり、GPU 上で実行されるため、 の__global__代わりに修飾子を使用する必要があり__host__ます。

ベクトルのコンテンツとその結果の両方を保持するために、GPU にメモリを割り当てる必要があります(dC の CudaMalloc はどこにありますか?)。ホストからメモリを割り当ててコピーする必要があるため、たとえば、 と の両方CudaMallocをホストでCudaMemcpy実行する必要があります。mainまた、結果をメイン メモリにコピーする必要がありますCudaMemcpyが、 direction を使用しcudaMemcpyDeviceToHostます。

最後に、そのようなカーネル関数を呼び出すことはできません。Cuda グリッドの次元であり、Cuda ブロックの次元であるvectorSum<<<dimGrid,dimBlock>>>(dA,dB,numOfData,dC);このようなものが必要になります。dimGriddimBlock

于 2013-04-03T12:19:59.423 に答える