Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用CUDA C+添加向量+;:don';我没有得到预期的结果_C++_Arrays_Cuda - Fatal编程技术网

C++ 使用CUDA C+添加向量+;:don';我没有得到预期的结果

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*

我最近开始了CUDA编程。我遵循了有关它的教程和指南,并从原始示例()复制了第一个程序,它基本上使用GPU添加两个向量。 我可以编译它,但是我得到的结果不是我期望的结果

这是我的密码:

#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 ]