首页 文章

是否可以将字符串数组卸载到Xeon Phi

提问于
浏览
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);
        }

}

1 回答

  • 0

    一种解决方案是将字符串存储在一个平面 char* temp_string 中,并将其与索引向量 int* vIndexes 配对,该索引向量保留每个字符串的起始索引 .

    检查此示例取自 here . 它代表使用 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)
    

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

相关问题