4

128ビットの変数/レジスタに16個のASCII文字(したがって16個の8ビット数)があるとします。ビット位置(インデックス)が16文字で表されるビットがハイになるビットマスクを作成したいと思います。

たとえば、これらの16文字から形成される文字列がである場合、"CAD..."ビットマスクでは67番目のビット、65番目のビット、68番目のビットなどは1である必要があります。残りのビットは0である必要があります。特別にそれを行う効率的な方法は何ですか。 SIMD命令を使用していますか?

テクニックの1つがこのような加算であることを私は知っています:2^(67-1)+2^(65-1)+2^(68-1)+... しかし、これは多くの操作を必要とします。できれば1、2回の操作・指導でやりたいです。

解決策を教えてください。

4

1 に答える 1

4

SSE4.2には、ほぼ必要なことを実行する1つの命令が含まれています。即時オペランド0のPCMPISTRM。そのオペランドの1つにはASCII文字が含まれている必要があり、その他は32、33、...47のような値の定数ベクトルです。 XMM0の最下位16ビットになります。128ビットが必要なため、この命令は異なる定数ベクトルを使用して8回実行する必要があります(印刷可能なASCII文字のみが必要な場合は6回)。各PCMPISTRMの後で、ビットごとのORを使用して、結果をXMMレジスタに累積します。

この方法には2つの欠点があります。(1)PCMPISTRMの詳細を理解するには、Intelのアーキテクチャソフトウェア開発者マニュアルを読む必要があります。これはおそらくこれまでで最も複雑なSSE命令であるためです。(2)この命令はかなり遅い(スループット1/2)。 Nehalemでは1/3、Sandy Bridgeでは1/4)、「ブルートフォース」方式に比べて速度が大幅に向上することはほとんどありません。

于 2012-04-09T11:57:06.543 に答える