14

1 か月前に Jelly Bean 4.2 が発表されたとき、Filterscript も発表されました。ファイル拡張子が異なる Renderscript の添え字である言語のようです。そして、それは言語について私が知っているすべてです。

インターネット全体に存在する Filterscript に関する合計 2 つの段落を読み、 で小さな.fsファイルを作成しましたが、通常のファイルが同じ場所にあるpragma rs_fp_relaxedように、ADT ビルダーによって取得されません。.rs

私の ADT は最新の公開バージョン (21.0.0) で、Filterscript には低すぎるようです。 tools.android.comには 21.0.1 Preview があるようですが、リリース ノートには Filterscript についての言及はありません (実際には単なるバグ修正リリースです)。どこにもドキュメントがありません!

Filterscript を使用するにはどうすればよいですか? そのドキュメントはどこにありますか?

私が試したこと:

https://www.google.com/search?q=filterscript+site:android.com&tbs=li:1

http://developer.android.com/about/versions/android-4.2.html#Renderscript

http://developer.android.com/tools/sdk/eclipse-adt.html#notes

http://tools.android.com/recent/2101preview1

4

3 に答える 3

17

ドキュメントは見つかりませんでしたが、これまでに調査した内容について役立つ情報を提供できるかもしれません。

  • ポインタは利用できません
  • カーネル関数にはこの属性が必要__attribute__((kernel))です
  • Renderscript APIを使用できます (少なくとも、これまでに試したことはすべて機能していました)
  • AndroidManifest.xml で属性「Min SDK version」を「17」に設定する必要があります -> 「Uses Sdk」

llvm-rs-cc コンパイラのソースを読んでいるときに、次の情報のほとんどを発見しました。さらなる情報や Filterscript の実際のドキュメントへのリンクをいただければ幸いです。

出力割り当て

Filterscript には、出力割り当て用のパラメーターがありません。代わりに、現在の位置に書き込む値を返します (これはグローバル スレッド ID ですx) y

uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y)

次のように生成されます。

public void forEach_root(Allocation aout)

入力割り当て

必要に応じて、入力割り当てをパラメーターとして渡すことができます。

uchar4 __attribute__((kernel)) root(const uchar4 in, uint32_t x, uint32_t y)

次のように生成されます。

public void forEach_root(Allocation ain, Allocation aout)

これは、現在の位置でのみ入力割り当てにアクセスできるため、まれなケース (ポイント演算子など) でのみ役立ちます。

グローバル割り当て

入力割り当てでランダムアクセスを行いたい場合は、グローバル割り当てが必要になります。これは、私にとって有効なグローバル割り当てを使用するウィンドウ オペレーターの小さな例です。

ぼかし.fs:

#pragma version(1)
#pragma rs java_package_name(com.example.myproject)

rs_allocation in;

uint32_t width;
uint32_t height;

uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
    uint4 sum = 0;
    uint count = 0;
    for (int yi = y-1; yi <= y+1; ++yi) {
        for (int xi = x-1; xi <= x+1; ++xi) {
            if (xi >= 0 && xi < width && yi >= 0 && yi < height) {
                sum += convert_uint4(rsGetElementAt_uchar4(in, xi, yi));
                ++count;
            }
        }
    }
    return convert_uchar4(sum/count);
}

MainActivity.java:

...
mRS = RenderScript.create(this);

mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
                    Allocation.MipmapControl.MIPMAP_NONE,
                    Allocation.USAGE_SCRIPT);
mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());

mScript = new ScriptC_blur(mRS, getResources(), R.raw.blur);
mScript.set_in(mInAllocation);
mScript.set_width(mBitmapIn.getWidth());
mScript.set_height(mBitmapIn.getHeight());

mScript.forEach_root(mOutAllocation);

mOutAllocation.copyTo(mBitmapOut);
...
于 2013-02-18T18:13:14.883 に答える
10

ここでいくつかのこと:

  • ええ、私たちはドキュメントに遅れをとっています。私たちは忙しいことを知っています。それは比較的近い将来の私の議題です。

  • FS は、RS のより制限的なバリアントとして意図されており、コンパイラ バックエンドの追加の最適化の機会を可能にします。現在、当社の CPU バックエンドには、同等の RS ファイルから入手できないものはありませんが、OEM が FS ファイルと汎用 RS ファイルを使用して SoC のパフォーマンスを向上させる可能性があります。一般に、これには__attribute__((kernel))、ポインター、共用体は必要なく、fp_relaxed はファイル タイプによって暗示されます。

  • ホスト側 API は完全に同一です。唯一の違いは、カーネル バイナリとして実際に何を渡すかです。

ofpの回答に対するいくつかの小さな修正:

  1. rsGetElementAt_(type) を使用する必要があります。キャストや追加の逆参照などを必要としないため、rsGetElementAt よりも大幅にクリーンです。
  2. #pragma fp_relaxed は .fs 拡張子から暗示され、FS ファイルでは必要ありません。
  3. rs_allocation.rsh を含める必要はありません (すべての RS/FS ファイルについても同様です)。
于 2013-02-19T22:04:52.690 に答える