__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;
}
答案 0 :(得分:0)
我建议你从Nvidia的例子开始,他们有一个做矢量加法的例子。 Here是代码的直接链接。
至于你的代码,关于代码中不正确的东西的一些指示。
如果您想使用Cuda,您需要在GPU上执行vectorSum
,但在此之前您需要修复程序中的某些内容。
vectorSum
将是Cuda的内核函数,它将在GPU上执行,因此您必须使用限定符__global__
而不是__host__
。
您需要在GPU上分配内存以保存向量内容及其结果(其中是CudaMalloc for dC?)。您需要从主机分配和复制内存,因此CudaMalloc
和CudaMemcpy
都应在主机上完成,例如main
。您还需要使用CudaMemcpy
将结果复制回主内存,但方向为cudaMemcpyDeviceToHost
。
最后,你不能调用这样的内核函数,你需要看起来像vectorSum<<<dimGrid,dimBlock>>>(dA,dB,numOfData,dC);
的东西,其中dimGrid
是Cuda网格的维度,dimBlock
是维度Cuda街区。