2017-06-05 7 views
1

私はCUDAプログラミングから始めています。通常のCPUに比べて速度がわかりません。しかし、私は今、簡単な論理的な検討をしています。私はデバイスコードであり、検査する4Dを持っています。 を定数に変更しました。私はatomicAddを使用して、デバイスコードを通じて各繰り返しを追加しました。線形インデックスを使用して4D配列にマップする

//get global counter 
int global_index = atomicAdd(&counter, 1); 

私は4Dボリュームを考え、4Dボリュームに線形インデックスをマップしようとします。 2D広告3Dでは、1Dインデックスから3Dマッピングに変換する効果的な方法があります。しかし、私はこの方法論がより高い次元にどのように拡大するかを知らない。

int x = gcfg->dimlen.x; 
int y = gcfg->dimlen.y/x; 
int z = gcfg->dimlen.z/gcfg->dimlen.y; 
int photons = numberofphotons[1]; 

私の4次元の長さです。そこで、私は上記の4つの次元(x、y、z、numberofphotons)で指定された長さの4D配列にマップするインデックスを持っています。

答えて

1

私はよく分かりませんあなたの質問の変数の意味を理解していますが、次のコードは1次元の長さ(x)== 2次元の長さ(y)== 3次元の長さ(z)== 4の場合です。これは、線形インデックスiを各次元のインデックスに変換します。first_indexsecond_indexthird_indexfourth_indexです。

int main() 
{ 
    int x = 4; 
    int y = 4; 
    int z = 4; 

    for (int i = 0; i < 100; i++) { 
     int fourth_index = i/(x * y * z); 
     int third_index = i % (x * y * z)/(x * y); 
     int second_index = i % (x * y * z) % (x * y)/x; 
     int first_index = i % (x * y * z) % (x * y) % x; 

     printf("%d: (%d, %d, %d, %d)\n", i, first_index, second_index, third_index, fourth_index); 
    } 
} 

他の方法で進むこともできます。

int main() 
{ 
    int x = 4; 
    int y = 4; 
    int z = 4; 

    for (int i = 0; i < 100; i++) { 
     int first_index = i % x; 
     int second_index = i/x % y; 
     int third_index = i/x/y % z; 
     int fourth_index = i/x/y/z; 

     printf("%d: (%d, %d, %d, %d)\n", i, first_index, second_index, third_index, fourth_index); 
    } 
} 
+0

これは私が探していたものです。 – woofwoof

関連する問題