C++ 使用CUDA C+添加向量+;:don';我没有得到预期的结果
我最近开始了CUDA编程。我遵循了有关它的教程和指南,并从原始示例()复制了第一个程序,它基本上使用GPU添加两个向量。 我可以编译它,但是我得到的结果不是我期望的结果 这是我的密码:C++ 使用CUDA C+添加向量+;:don';我没有得到预期的结果,c++,arrays,cuda,C++,Arrays,Cuda,我最近开始了CUDA编程。我遵循了有关它的教程和指南,并从原始示例()复制了第一个程序,它基本上使用GPU添加两个向量。 我可以编译它,但是我得到的结果不是我期望的结果 这是我的密码: #include <iostream> #include <random> using namespace std; //Size of vector #define N 16 //Kernel for adding vector __global__ void add(int*
#include <iostream>
#include <random>
using namespace std;
//Size of vector
#define N 16
//Kernel for adding vector
__global__ void add(int* a, int* b, int* c){
c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x];
}
//Functions
void printArray(int* a){
cout << "[ ";
for(int i = 0; i < N; i++){
cout << *(a+i) << " ";
} cout << "]" << endl;
}
void fillRandomValue(int* a, int size, int range){
for(int i = 0; i < size; i++){
*(a+i) = rand() % range;
}
}
int main(void){
//Declaration of vector for host and device : a for host ; d_a for device a ;
int* a,* b,* c;
int* d_a,* d_b,*d_c;
int size = N * sizeof(int);
//Allocate memory into the device
cudaMalloc((void** )&d_a, size);
cudaMalloc((void** )&d_b, size);
cudaMalloc((void** )&d_c, size);
//Declaring 3 array
a = new int[size];
b = new int[size];
c = new int[size];
//Randomn array
//Initialize randomn seed
srand (time(NULL));
fillRandomValue(a, N, 10);
fillRandomValue(b, N, 10);
//Copy host to device
cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);
//Adding vector
add<<<N,1>>>(d_a, d_b, d_c);
//Get back the result
cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost);
//Output to console
cout << "a = "; printArray(a); cout << endl;
cout << "b = "; printArray(b); cout << endl;
cout << "a + b = "; printArray(c); cout << endl;
//Free memory
free(a); free(b); free(c);
cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
return 0;
}
我试着看看那些不是地址,但不是。 我还试图从上面的链接复制直接代码,但没有成功。
我可以随心所欲地重现这种行为。如评论中所述,问题出在
cudemmpy(d_a,&a,size,cudamemcpyhostodevice)
符号不应该在这里。如评论中所述,问题出在
cudemmpy(d_a,&a,size,cudaMemcpyHostToDevice)
符号不应该在这里。这是错误的:
cudaMemcpy(d_a,&a,size,cudaMemcpyHostToDevice)代码>去掉符号(&)。下一行也是如此。您在内核之后的复制操作中正确地执行了该操作(在c
前面没有符号)。你也应该使用。需要明确的是,尽管您可能从链接的演示文稿中“复制”了某些内容,但您也对其进行了更改(与幻灯片25中的内容相比)。这些变化很重要。仅供参考,没有C/C++语言。C语言和C++语言是不同的语言。例如,C++有<代码> STD::向量< /代码>,C没有。C++具有模板、继承和函数重写,C语言没有。请根据需要更新帖子标题和语言标签。谢谢@RobertCrovella!我没有看到它(如果它是英语的话,我更没有想到它)。我将标记已解决的问题谢谢。我将更正它谢谢@thomasmatthewst这是不正确的:cudaMemcpy(d_a,&a,size,cudamemcpyhostodevice)代码>去掉符号(&)。下一行也是如此。您在内核之后的复制操作中正确地执行了该操作(在c
前面没有符号)。你也应该使用。需要明确的是,尽管您可能从链接的演示文稿中“复制”了某些内容,但您也对其进行了更改(与幻灯片25中的内容相比)。这些变化很重要。仅供参考,没有C/C++语言。C语言和C++语言是不同的语言。例如,C++有<代码> STD::向量< /代码>,C没有。C++具有模板、继承和函数重写,C语言没有。请根据需要更新帖子标题和语言标签。谢谢@RobertCrovella!我没有看到它(如果它是英语的话,我更没有想到它)。我将标记问题已解决谢谢。我将更正它谢谢@ThomasMatthews@ThomasMatthews
a = [ 5 5 7 2 9 5 3 5 4 5 2 9 6 7 4 9 ]
b = [ 9 6 9 8 9 7 5 6 6 6 2 8 7 3 1 2 ]
a + b = [ -971240544 44196 -2117203120 54617 1031799296 65038 1031800320 65038 -2117199280 54617 -1009853744 44196 -1048817168 44196 -1307968288 54865 ]