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

一种解决方案是将字符串存储在一个平面中,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)

第一个解决方案的优点是它是完全动态的,并且可以根据需要传输完全相同数量的数据。第二种解决方案将允许编译器正确对齐您的结构并更好地利用矢量化。

于 2014-11-01T09:43:27.977 回答