思い通りに動作しない小さなテスト関数を作成しました。
基本的に、配列を読み取ってその内容を書き戻す必要があります (後でこれが機能するようになったら、さらに多くのことを行う必要がありますが、今のところこれでも失敗します)。
GPU コードをデバッグすると、最初の数回の反復 (どういうわけか並行して実行されます.. これはおそらく GPU にとっては理にかなっていますが、デバッグすると驚きます) が正常に機能していることがわかりました..しかし、その後、1-2 Debug-Continues (F5)、以前に正しく設定された値の一部が 0 で上書きされます。よくわかりません..再びCPUを使用するまでに、0であってはならないにもかかわらず、多くの値が0になっています(基本的に、単純なテストシーケンスである元のデータが必要です)。
#include "stdafx.h"
#include <amp.h>
typedef unsigned char byte;
using namespace concurrency;
void AMPChangeBrightnessContrastWrapper2(byte* a, int len, float brightness, float contrast)
{
array_view<unsigned int> dst(len/4, (unsigned int*)a);
//dst.discard_data();
parallel_for_each(dst.extent, [=](index<1> idx) restrict(amp)
{
// split into bytes (in floats)
float temp1 = (dst[idx]) - (dst[idx] >> 8) * 256;
// this completely fails! float temp1 = dst[idx] & 0xFF;
float temp2 = (dst[idx] >> 8) - (dst[idx] >> 16) * 256;
float temp3 = (dst[idx] >> 16) - (dst[idx] >> 24) * 256;
float temp4 = (dst[idx] >> 24);
// convert back to int-array
dst[idx] = (int)(temp1 + temp2 * 256 + temp3 * 65536 + temp4 * 16777216);
});
//dst.synchronize();
}
int _tmain(int argc, _TCHAR* argv[])
{
const int size = 30000;
byte* a = new byte[size];
// generate some unique test sequence.. first 99 numbers are just 0..98
for (int i = 0; i < size; ++i)
a[i] = (byte)((i + i / 99) % 256);
AMPChangeBrightnessContrastWrapper2(a, size, -10.0f, 1.1f);
for (int i = 0; i < 50; ++i)
printf("%i, ", a[i]);
char out[20];
scanf_s("%s", out);
return 0;
}
とても簡単な(計画された)手順:
- 配列の初期化
- 配列を GPU に渡します (unsigned int 配列として)
- 各 unsigned int を 4 バイトに分割し、float に格納します
- (いくつかの計算を行いますが、簡単にするためにここでは省略しています)
- フロートに格納されたバイトを元の位置に再び連結します
- (繰り返す)
ご参考までに..これは色の値であるはずです..
結果は次のとおりです。
- 一部の値は予想どおりですが、ほとんどの値は異なります
- 特にバイト0(各unsigned intの)の値が悪いようです
- 最初に unsigned int->byte->float を & 0xFF で変換しようとしましたが、完全に失敗したようです
出力は次のとおりです (ただし、0 から始まる数字が増えるだけである必要があります)。
0、1、2、3、0、5、6、7、0、9、10、11、16、13、14、15、0、17、18、19、32、21、22、23、32、 25, 26, 27, 32, 29, 30, 31, 0, 33, 34, 35, 64, 37, 38, 39, 64, 41, 42, 43, 64, 45, 46, 47, 64, 49,
質問:
- & 0xFF の問題はなぜですか?
- 各 unsigned int のバイト 0 に奇妙な値が割り当てられるのはなぜですか?
- バイトのarray_viewを作成できないと思います.intまたはfloatを使用する必要がありますか?
- 最後に .synchronize をコメントアウトしても何も変わらなかった - どうして?