2012-03-10 15 views
1

さまざまなサイズ(8ビット、16ビット、32ビット、64ビット)の整数を格納するために、グローバルメモリのバイトバッファを使用する際に問題があります。Cuda:連続したさまざまなサイズのデータ​​を格納するためにグローバルメモリを使用する

ポインタの値に4バイトの整数ではない整数を格納すると(たとえば、私が8ビット整数を格納したため)、アドレスは切り捨てられ、以前のデータは消去されます。いずれか使用して、このコード例では

__global__ void kernel(char* pointer) 
{ 
    *(int*)(pointer+3)=3300000; 
} 

、整数は、(ポインタ)に格納されている(ポインタ)、(ポインタ+ 1)、(ポインタ+ 2)、(ポインタ+ 3)は、考慮ポインタであります4の倍数。

ハードウェアレベルで32ビットブロックで構成されていますか? この作業を行う方法はありますか?

+2

なぜ 'int'ポインタを使って、*コンパイラが最適な配列を決めるのはなぜですか?何百もの専門家が可能な限りハードウェアで最高の状態で動作するように設計されたテクノロジの一部です。 –

+0

私はさまざまなサイズのデータ​​を格納する必要があります:char、int、long long intなどです。私のプロジェクトでは、intポインタを使用して、charを格納する必要があるたびに24ビットのメモリを失うことはできません。 (等価なコードはCで完全に正常に動作するので、私はCudaの特異性のようです)。 – Ndech

+1

Cudaにはワードサイズのアライメントが必要です。それは交渉可能ではありません。非32ビット整列アドレスを32ビット型にキャストすることはできません。 – talonmies

答えて

1

CUDAでは、ワードサイズのアライメントは無視できません。ただし、何らかの理由でパフォーマンスが低下した場合は、データをchar *にパックして、独自のカスタムストレージ機能を作成することもできます。

__inline __device__ void Assign(int val, char * arr, int len) 
{ 
    for (int idx = 0; idx < len; idx++) 
     *(arr+idx)=(val & (0xFF<<(idx<<8)) 
} 

__inline __device__ int Get(char * arr, int idx, int len) 
{ 
    int val; 
    for (int idx = 0; idx < len; idx++) 
     val=(int)(*arr[idx+len*idx]<<(idx<<8))); 
    return val; 
} 

希望します。

+0

ありがとうございました!私はあなたのソリューションを試し、私のアプリケーションのパフォーマンスとメモリ使用の最適化との間の最適なトレードオフを見いだします。 – Ndech