0

pyOpenCl 2013.1 を使用しており、nVidia GPU、AMD CPU、AMD GPU ではコードがクラッシュしますが、Intel CPU では動作します。

nvidia GPU を使用すると、カーネルの呼び出し後にqueue.finishでエラーが発生します。

LogicError: clFinish failed: invalid command queue

次のスニペットの 48 行目に原因が見つかりました。

1:  typedef struct {
2:    int global_index;
3:    int local_index;
4:    float speed_limit;
5:    float width;
6:  } segment_t;
7:  
8:  typedef struct {
9:      int item_count;
10:     segment_t first_item;
11: } segment_list_t;
12: 
13: void explode_segment_list_t(segment_list_t* list, segment_t** array)
14: {
15:     array[0] = &(list->first_item);
16: }
17: 
18: 
19: 
20: /*
21:  * ro_data is read-only array of 3316 byte (829 int)
22:  * wo_data is write-only array of 3316 byte (829 int)
23:  */
24: __kernel void test_kernel(global int* ro_data, global int* wo_data)
25: {
26:     unsigned int i = get_global_id(0);
27:     
28:     // copy uncasted, primitive types
29:     for(int index = 0; index < ro_data[0]; index++)
30:         wo_data[index] = ro_data[index];                 // this works
31:     
32:     // access casted local struct
33:     int temp[829] = {0};
34:     segment_list_t* casted_temp_list = (segment_list_t*)temp;
35:     casted_temp_list->item_count = 1337;                 // this works
36:     // do more tests
37:     segment_t* casted_temp_array;
38:     explode_segment_list_t(casted_temp_list, &casted_temp_array);
39:     casted_temp_array[1].global_index = 1;
40:     casted_temp_array[2].global_index = 2;               // this works
41:     
42:     // copy local data to global data
43:     for(int index = 0; index < ro_data[0]; index++)
44:         wo_data[index] = temp[index];                    // this works
45:         
46:     // access casted global memory
47:     segment_list_t* casted_wo_data = (segment_list_t*)wo_data;
48:     casted_wo_data->item_count = 42;                     // this fails on GPU but works on CPU
49:     
50: }

実行可能な pyopencl.capture_call はこちら

見苦しいメモリ浪費の修正は、ローカル配列を割り当て、データをコピーしてからキャストすることです。しかし、私はここで何か間違ったことをしたと確信しています...しかし、何ですか?

ご協力いただきありがとうございます!

編集: AMD デバイス (CPU および GPU) では、より有益なメッセージで失敗します。

 *error: invalid type conversion
      segment_list_t* casted_wo_data = (segment_list_t*)wo_data;*
4

2 に答える 2

1

AMD SDK からのエラー メッセージが原因の特定に役立ちました。

フォーラムの投稿で説明されているように、キャストされた型にはソース変数と同じメモリ位置の注釈が必要です。

この例では:

segment_list_t* casted_wo_data = (segment_list_t*)wo_data;

次のものに置き換える必要があります。

global segment_list_t* casted_wo_data = (global segment_list_t*)wo_data;
于 2013-09-30T05:44:03.880 に答える
0

あなたが何を間違えたのかわかりません。

しかし、あなたのやり方は正しい方法ではなく、多くのトラブルを引き起こすと言えます。

カーネルの入力と出力を と として宣言する必要がありsegment_tますsegment_list_t。これらの typedef をカーネル コードと Python コードで宣言してから、適切な型のバッファーを作成できます。この方法では、何もキャストする必要がなく、範囲外のエラーを回避できます。

于 2013-09-27T13:28:10.743 に答える