0

xeon phi で文字列のすべての部分文字列を取得したい
まず、args から txt ファイルを読み取り、次のようにポインター配列に格納します。

char *temp_string[N_ELEMENT];

次に、pragma offlad を使用して、この配列を xeon phi にコピーします。

#pragma offload target(mic: 0) in(temp_string:length(N_ELEMENT))

コマンドラインから次のメッセージが表示されます

error: variable "temp_string" used in in/out/inout clause is an array whose underlying type is "char *"

私の問題を解決する解決策はありますか?


オフロード セクションは次のようになります。

#pragma offload target(mic: 0) in(temp_string:length(N_ELEMENT))
#pragma omp parallel for private(c, i, length)
for(n = 0; n < N_ELEMENT; ++n) 
{
    length = strlen(temp_string[n]);

    for( c = 0 ; c < length ; c++ )
        for( i = 1 ; i <= length - c ; i++ )
        {
            sub = substring(temp_string[n], c+1, i);
            printf("%s \n", sub);
        }

}
4

1 に答える 1

0

1 つの解決策は、文字列を各文字列の開始インデックスを保持char* temp_stringするインデックス ベクトルと組み合わせてフラットに格納することです。int* vIndexes

ここから取ったこの例を確認してください。セクションを使用するすべてのケースを表しますoffload

typedef int ARRAY[10][10]; 
int a[1000][500];
int *p;
ARRAY *q;
int *r[10][10];
int i, j;
struct { int y; } x;
#pragma offload …  in( a )
#pragma offload … out( a[i:j][:] )
#pragma offload …  in( p[0:100] )
#pragma offload …  in( (*q)[5][:] )
#pragma offload …  in( r[5][5][0:2] )
#pragma offload … out( x.y )

いずれの場合も、転送されるブロックのサイズはコンパイル時に決定できます。と でケースをチェックし*qます*r。あなたの場合、temp_string の各要素のサイズを決定できません。そこで、最初に提案された解決策を試してみます。

私は XeonPhi を持っていないので、試すことはできませんが、次のことも試してみます。

typedef char CHAR_ARRAY[MAX_STRING_SIZE];
CHAR_ARRAY temp_string[N_ELEMENTS];
#pragma offload target(mic: 0) in(temp_string)

最初のソリューションの利点は、完全に動的であり、必要な量とまったく同じ量のデータを転送することです。2 番目の解決策は、コンパイラーが構造を適切に整列させ、ベクトル化をより有効に活用できるようにすることです。

于 2014-11-01T09:43:27.977 に答える