2016-11-14 20 views
-1

下面的例子:cudaMemcpy无效参数:在简单的矢量例如

#include <stdio.h> 
#include <stdlib.h> 
#include <cuda_runtime.h> 
#include <cuda.h> 
#include <math.h> 


#define N 100 
#define t_num 256 

int main(){ 

    int vector_one_h[t_num], vector_one_g[t_num]; 

    cudaError_t err = cudaMalloc((void**)&vector_one_g, t_num * sizeof(int)); 
    printf("Cuda malloc vector swap one: %s \n", cudaGetErrorString(err)); 
    printf("Device Vector: %p \n:" , vector_one_g); 

    for(int m = 0; m < t_num; m++){ 
      vector_one_h[m] = rand() % N; 
    } 

    err = cudaMemcpy(vector_one_g, vector_one_h, t_num * sizeof(int), cudaMemcpyHostToDevice); 
      printf("Cuda mem copy vector swap one: %s \n", cudaGetErrorString(err)); 
} 

返回结果:

Cuda malloc vector swap one: no error 
Device Vector: 0x7ffcf028eea0 
:Cuda mem copy vector swap one: invalid argument 

那么,为什么cudaMemcpy接收了无效的参数?

cudaMemcpy()here文档我想这个问题可能是我需要给第二个参数作为地址,&vector_one_h,但放置在代码返回完全相同的错误。

而且,虽然有许多关于cudaMemcpy无效参数的帖子,但我相信这不是重复的,因为大多数其他问题都有非常复杂的示例,而这是一个非常简单和最小的示例。

回答

1

尝试改变第一行:

int vector_one_h[t_num], *vector_one_g; 

顺便说一句,与&前缀数组名没有任何效果。通过C语法的定义,数组名称本身就是常量指针。

+0

非常感谢!你能编辑你的答案来解释为什么这是必要的吗?我很惊讶我不需要在复制之前预先分配'vector_one_g'的大小(我想我说得对)。 –

+1

malloc进行分配。你只需要提供一个指向新分配内存的指针变量。换句话说,cudaMalloc返回作为第一个参数传递给它的指针变量中分配内存的地址。 – jaeheung