【问题标题】:cudaMemcpy invalid argument: in simple vector examplecudaMemcpy 无效参数:在简单向量示例中
【发布时间】:2017-03-28 16:10:41
【问题描述】:

下面的例子:

#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 的文档中,我认为问题可能是我需要将第二个参数作为地址&amp;vector_one_h,但将其放在代码中会返回完全相同的错误。

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

【问题讨论】:

    标签: memory memory-management cuda gpu


    【解决方案1】:

    尝试将第一行更改为:

    int vector_one_h[t_num], *vector_one_g;
    

    顺便说一句,在数组名称前加上 & 没有任何效果。根据 C 语法的定义,数组名称本身就是常量指针。

    【讨论】:

    • 非常感谢!你能编辑你的答案来解释为什么这是必要的吗?我很惊讶我不需要在复制之前预先分配vector_one_g 的大小(我想我说的没错)。
    • malloc 进行分配。您只需要提供一个指向新分配的内存的指针变量。换句话说,cudaMalloc 在作为第一个参数传递给它的指针变量中返回分配的内存地址。
    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多