2012-01-28 59 views
2

我只寫了我的第一個CUDA程序,它實際上是對C++代碼的重寫。現在它處理了很多矢量數學,所以我使用float4數據類型,它提供了我所需要的。然而,舊的代碼中包含了大量的在CUDA中使用循環訪問float4/int4元素

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

現在採用float4所有我能做的就是寫每個.X線,.Y,.Z .W我覺得這有點討厭。有沒有辦法以類似的方式訪問float4元素,即

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

不幸的是,我在互聯網上找不到任何提示。

在此先感謝。

回答

5

您可以使用聯合,例如

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

U4 u; 

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

爲了您的float4陣列你只需改變基本類型U4

注意:從技術上講,UB寫入聯合的一個變體,然後從另一個變體讀取,但在這種情況下它應該可以正常工作,因爲這是CUDA特定的,所以不需要擔心可移植性。

+0

這是完美的,謝謝你一百萬。 – Azrael3000 2012-01-28 15:33:48

2

可能不安全,但這裏是最簡單的方法。

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

或者,如果你有一個數組,你可以翻轉這個

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

編輯 直接存儲到一個數組會是這樣

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

所以唯一的辦法float4s,你可以做像下面這樣的

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都是陣列本身,這可能會變得非常討厭。我只是想知道是否有一些直接在float4上運行的本地操作。不管怎麼說,多謝拉。 – Azrael3000 2012-01-28 09:57:20

相關問題