2012-01-28 11 views
2

私は最初のCUDAプログラムを書いています。実際はC++コードの書き換えです。今では多くのベクトル演算を扱っているので、私は必要なものを正確に提供するfloat4データ型を使用します。ただし、古いコードは、私にできるのfloat4すべてで今すぐCUDAでループを使用してfloat4/int4要素にアクセスする

float *vec; 
vec = new float[4]; 
for(int i=0; i<4; i++) vec[i] = ...; 

の多くが含まれている、各.Xの行を書く.Y、.Z、私は少し迷惑見つけた.Wです。

float4 vec; 
for(int i=0; i<4; i++) vec[i] = ...; 

は、残念ながら私は、インターネット上の任意のヒントを見つけることができなかった、すなわち、同様の方法でのfloat4要素にアクセスする方法はありません。

ありがとうございます。

答えて

5

ユニオンを使用できます(例:あなただけU4に基本となるタイプを変更しますfloat4のあなたの配列の場合

typedef union { 
    float4 vec; 
    float a[4]; 
} U4; 

U4 u; 

for (int i = 0; i < 4; ++i) u.a[i] = ...; 

注:技術的には、ユニオンの1つのバリアントに書き込んでから別のものを読むのはUBですが、この場合は正常に動作するはずです。これはCUDA固有なので移植性について心配する必要はありません。

+0

これは完璧です、ありがとうございます。 – Azrael3000

2

おそらく安全ではないかもしれませんが、ここが最も簡単な方法です。

float *vec; 
vec = new float[4]; 
for(int i=0; i<4; i++) vec[i] = ...; 
float4 vec4 = *(float4 *)vec; 

それとも、あなたがの配列を持っているので、もし直接配列に格納するための唯一の方法は、この

float4 vec4 = {val[0], val[1], val[2], val[3]}; 

のようになる。この

float4 vec4; 
float *vec = (float *)&vec4; // Do not free this pointer 
for(int i=0; i<4; i++) vec[i] = ...; 

EDIT 反転することができますfloat4s、あなたは次のようなsomehtingをすることができます

float4 *vec4 = new float4[10]; 
float *vec = new float[4]; 
for(int i = 0; i < 10; i++) { 
for(int j = 0; j < 4; j++) vec[j] = j; 
vec4[i] = (float4){vec[0], vec[1], vec[2], vec[3]} 
} 

これ以外にも簡単な方法はありません。

+0

これはうまくいくかもしれませんが、私のfloat4はすべて配列そのものなので、これはかなり厄介なものになります。私は浮動小数点4に直接作用するいくつかのネイティブ演算があるかどうか疑問に思っていました。とにかく、ありがとう。 – Azrael3000

関連する問題