如何使用 openmp 目标映射数据以在函数内部使用?
How to map a data with openmp target to use inside a function?
我想知道如何映射数据以供将来在函数内部使用?
我写了一些代码如下:
struct {
int* a;
int *b;
// other members...
} s;
void func1(struct s* _s){
int a* = _s->a;
int b* = _s->b;
// do something with _s
#pragma omp target
{
// do something with a and b;
}
}
int main(){
struct s* _s;
// alloc _s, a and b
int *a = _s->a;
int *b = _s->b;
#pragma omp target data map(to: a, b)
{
func1(_s);
// call another funcs with device use of mapped data...
}
// free data
}
代码编译,但在执行时 Kernel execution error at <address>
被冗长的执行输出垃圾邮件,随后是许多 Device kernel launch failed!
和 CUDA error is: an illegal memory access was encountered
您的映射指令看起来可能将指针 a
和 b
的值映射到设备而不是它们指向的数组。我想你想塑造它们,以便运行时映射数据而不仅仅是指针。就个人而言,我也会将 map 子句也放在您的目标区域上,因为这为编译器提供了更多可使用的信息,并且当前检查将从外部数据区域找到设备上已有的数据,并且不会执行任何进一步的数据移动。
我想知道如何映射数据以供将来在函数内部使用?
我写了一些代码如下:
struct {
int* a;
int *b;
// other members...
} s;
void func1(struct s* _s){
int a* = _s->a;
int b* = _s->b;
// do something with _s
#pragma omp target
{
// do something with a and b;
}
}
int main(){
struct s* _s;
// alloc _s, a and b
int *a = _s->a;
int *b = _s->b;
#pragma omp target data map(to: a, b)
{
func1(_s);
// call another funcs with device use of mapped data...
}
// free data
}
代码编译,但在执行时 Kernel execution error at <address>
被冗长的执行输出垃圾邮件,随后是许多 Device kernel launch failed!
和 CUDA error is: an illegal memory access was encountered
您的映射指令看起来可能将指针 a
和 b
的值映射到设备而不是它们指向的数组。我想你想塑造它们,以便运行时映射数据而不仅仅是指针。就个人而言,我也会将 map 子句也放在您的目标区域上,因为这为编译器提供了更多可使用的信息,并且当前检查将从外部数据区域找到设备上已有的数据,并且不会执行任何进一步的数据移动。