这个函数发送到GPU进行计算?

时间:2013-04-03 11:49:47

标签: c cuda

__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端创建了数组,使用此函数我尝试对这两个数组求和:

__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上进行此计算。我对此表示怀疑。

其次,我把这个函数称为main:

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;
}

1 个答案:

答案 0 :(得分:0)

我建议你从Nvidia的例子开始,他们有一个做矢量加法的例子。 Here是代码的直接链接。

至于你的代码,关于代码中不正确的东西的一些指示。

如果您想使用Cuda,您需要在GPU上执行vectorSum,但在此之前您需要修复程序中的某些内容。

vectorSum将是Cuda的内核函数,它将在GPU上执行,因此您必须使用限定符__global__而不是__host__

您需要在GPU上分配内存以保存向量内容及其结果(其中是CudaMalloc for dC?)。您需要从主机分配和复制内存,因此CudaMallocCudaMemcpy都应在主机上完成,例如main。您还需要使用CudaMemcpy将结果复制回主内存,但方向为cudaMemcpyDeviceToHost

最后,你不能调用这样的内核函数,你需要看起来像vectorSum<<<dimGrid,dimBlock>>>(dA,dB,numOfData,dC);的东西,其中dimGrid是Cuda网格的维度,dimBlock是维度Cuda街区。