cudaMemcpy无效参数:在简单的向量示例中

时间:2016-11-14 22:07:50

标签: memory memory-management cuda gpu

以下示例:

#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 个答案:

答案 0 :(得分:1)

尝试将第一行更改为:

int vector_one_h[t_num], *vector_one_g;

BTW,在数组名称前加上&amp;没有效果。通过C语法的定义,数组名称本身就是常量指针。