2016-11-14 10 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のドキュメントから、私は2番目の引数をアドレス&vector_one_hとして与える必要があるかもしれないと思っていましたが、それをコードに置くとまったく同じエラーが返されます。

cudaMemcpyの無効な議論についての投稿が多数ありますが、これは重複していないと思われます。他の質問のほとんどは非常に複雑な例ですが、これは非常に単純で最小限の例です。ところで、&で配列名を前置しても効果はありません

int vector_one_h[t_num], *vector_one_g; 

答えて

1

はに最初の行を変更してみてください。配列名は、C構文の定義によって、それ自体で定数ポインタです。

+0

ありがとうございました!それがなぜ必要なのかを説明するためにあなたの答えを編集できますか?私は、コピーする前に 'vector_one_g'のサイズを事前に割り当てる必要はない(私はそれが正しいと言っていると思います)と驚いています。 –

+1

mallocが割り当てを行います。新しく割り当てられたメモリを指すポインタ変数を指定するだけでよい。言い換えれば、cudaMallocは、渡されたポインタ変数内の割り当てられたメモリのアドレスを、最初の引数として返します。 – jaeheung