1

thread_id をマップしたいと思います。これは C/CUDA での話ですが、私が解決しようとしているのはもっと代数的な問題です。

したがって、私が達成しようとしているマッピングは次のとおりです。

  • スレッド 0 ~ 15: 読み取り値配列 [0]
  • スレッド 16 ~ 31: 読み取り値 [3]
  • スレッド 32 ~ 47: 読み取り値 [0]
  • スレッド 48 ~ 63: 読み取り値 [3]
  • スレッド 64 ~ 79: 値配列の読み取り [6]
  • スレッド 80 ~ 95: 値配列の読み取り [9]
  • スレッド 96 ~ 111: 値配列の読み取り [6]
  • スレッド 112 ~ 127: 値配列の読み取り [9]

等々..

これはマッピングを簡略化したものであることに注意してください。実際には 128 を超えるスレッドがありますが、シーケンスは示されているとおりであり、スレッドは常に 3 の倍数にマップされます。

各スレッドを実行して、どの配列位置を見る必要があるかを調べるには、どの式を使用できますか?

次の例のように、明示的なマップや if ステートメントではなく、ある種の式を使用したいと思います。

別のマッピングを必要とする別のケースでこれをどのように解決したかを説明するには、次のようにします。

  • スレッド 0 ~ 31: 読み取り値配列 [0]
  • スレッド 32 ~ 63: 読み取り値 [3]

コードを使用しました

rintf(float(tid)/96.0)*3
4

2 に答える 2

6

これはCで機能します:

3 * ((n>>4 & 1) + (n>>5 & ~1))

nスレッド番号です。

ここでは、パターンが 128 を超えて 0、3、0、3、6、9、6、9、12、15、12、15 などと続くと仮定しました。

編集:

この形式は、ビットごとの演算を使用しないため、理解しやすい場合があります。

6 * (n/64) + 3 * ((n/16) % 2)

同じ結果が得られます。nは整数と見なされるため、除算は切り捨てられます。

于 2010-02-11T15:57:22.097 に答える
0
int f(int thread_id)
{
    int tmp = thread_id % 64;
    int tmp2 = thread_id / 64;
    if (tmp =< 15 || (tmp >= 32 && tmp <= 47))  {
         return tmp2 * 6;
    } else {
         return tmp2 * 6 + 3;
    }
}
于 2010-02-11T16:04:04.793 に答える