我想在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);
}
}
答案 0 :(得分: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)
第一种解决方案的优点是它是完全动态的,可以根据需要传输完全相同数量的数据。第二种解决方案将允许编译器正确对齐您的结构并更好地利用矢量化。