2017-06-27 10 views
-1

以下のコードを使用して、GPU上のポインタによる割り当て方法をテストします。std :: vectorを使用するときに割り当てるcudaMalloc()<int *>

#include <stdio.h> 
#include <cuda_runtime.h> 
#include <iostream> 
#include <vector> 
using namespace std; 

int main(void) 
{ 
    cudaError_t err = cudaSuccess; 
    size_t numBytes; 
    vector<int*> a; 

    numBytes = 10 * sizeof(int); 
    err = cudaMalloc((void**)&a[0], numBytes); 

    if (err != cudaSuccess) 
    { 
     fprintf(stderr, "Failed to allocate device vector A (error code %s)!\n", cudaGetErrorString(err)); 
     exit(EXIT_FAILURE); 
    } 
    printf("Done\n"); 
    return 0; 
} 

私はcmdで正常にコンパイルできます。nvcc b.cu -o b.o、しかし、私はcmdで、それを実行すると:私は、ポインタを使用しての間にいくつかのミスがあると思います

Failed to allocate device vector A (error code invalid argument)! 

./b.o、私は、次の誤ったメッセージに会いましたしかし、なぜそれが起こったのか分かりません。

答えて

2

ベクトルaには要素がありません。これは空のベクトルです。 a[0]が存在しません。

std::vectorとそのconstructorsは、CUDAとは関係ありません。使用しているコンストラクタのタイプの最初の注意に注意してください。

1)デフォルトのコンストラクタ。空のコンテナを作成します。

ゼロ以外のサイズ例えば:

vector<int*> a(5); 

を持つように、そのベクトルを定義するなら、私はあなたがそのエラーを乗り越えることができるでしょうと思います。 (たとえば、これは5つのintポインタを格納するためのスペースを割り当てる)

1

そのテンプレート署名を覚え、GPUデバイスに割り当てられたstd::vector用メモリを有することである。

template< 
    class T, 
    class Allocator = std::allocator<T> 
> class vector; 

である、それはアロケータを取りクラスをテンプレートパラメータとして使用します。このクラスはGPU上で割り当てを実行する可能性があります。現在では、C++の標準ライブラリアロケータメカニズムは、あまりうまく設計されていないか、または使用するのに非常に親切であるとみなされますが、使用可能です。カスタム版の作成にはthis (old-ish) tutorialをお試しください。

H-o-w-e-v-e-r ...これはあなたが望むものではない可能性があります。ほとんどのメソッドはホストのみであり、C++標準ライブラリの多くは動作しないため、デバイスに組み込まれてコンパイルされないため、デバイス側のコードにstd::vectorを使用することはできません。

より適切な代替手段は、標準ライブラリのようなコンテナおよび汎用アルゴリズムを提供するthrustライブラリを使用することができます。推力にはdevice_vector classがあります。これはあなたが実際にしている可能性があります。

+0

目的が、デバイスポインタを含むホストstd :: vectorを持つことであるなら、どのように実際に役立つのでしょうか? – talonmies

+0

@talonmies:2番目のオプションは、切り替えの目的を示唆しています。最初のオプションは機能します - アロケータはCUDAデバイス上でallocateを使うことができます。おそらく私はそれをもっと明確にすべきです。 – einpoklum

関連する問題