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

Posted

技术标签:

【中文标题】是否可以将字符串数组卸载到 Xeon Phi【英文标题】:Is it possible offload a string array to Xeon Phi 【发布时间】:2014-11-01 09:31:26 【问题描述】:

我想在 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);
        


【问题讨论】:

你能在卸载部分发布一些你在哪里使用 temp_string 的代码吗? 【参考方案1】:

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

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

【讨论】:

我不确定我明白你的意思,你能给我一些例子来提示我如何解决我的问题吗?非常感谢。 错误:in/out/inout 子句中使用的变量“temp_string”是一个基础类型为“char *”的数组#pragma offload target(mic: 0) in(temp_string:length[N_ELEMENT] [0:26]) 内部错误:断言失败:for_statement:预期用于(shared/cfe/edgcpfe/statements.c,第 5575 行) 尝试删除“长度”。像这样使用它:in(temp_string[N_ELEMENT][0:26]) 错误:in/out/inout 子句中使用的变量“temp_string”是一个基础类型为“char *”的数组#pragma offload target(mic: 0) in(temp_string[N_ELEMENT][0 :26])

以上是关于是否可以将字符串数组卸载到 Xeon Phi的主要内容,如果未能解决你的问题,请参考以下文章

我可以通过 Interop 使用 C++ dll 卸载到 Xeon Phi 吗?

Xeon phi 卸载模式如何利用线程并行和矢量化

Xeon-Phi 从主机 openMP 并行区域异步卸载

将 Xeon Phi 与基于 JVM 的语言一起使用

关于 Xeon Phi 的 SCIF 问题

在 xeon-phi 上引导自定义内核