地址空间限定符
地址空间用于表达AICore物理存储空间,Davichi AICore核心具备多级独立片上存储,各个地址空间独立编址,具备各自的访存指令。毕昇编译器设备侧编程基于C/C++语法扩展允许地址空间作为合法的类型限定符,以提供针对不同地址空间的访问能力和地址空间合法性检查。
__gm__ - global memory (DDR) __ubuf__ - Vector Unified Buffer __ca__ - Cube L0A Buffer __cb__ - Cube L0B Buffer __cc__ - Cube L0C Buffer __cbuf__ - Cube L1 Buffer empty (Type *) - private address (stack address)
地址空间限定符可以在变量声明中使用,用于指定对象分配的区域。如果对象的类型被地址空间名称限定,那么该对象将被分配在指定的地址空间中。同样地,可以通过地址空间来限定指针指向的类型,从而明确该指针所指向对象所在的地址空间。以下是具体的代码示例:
// declares a pointer p in the __gm__ address space that
// points to an object(has int type) in the __gm__ address space
__gm__ int *__gm__ p;
__global__ [aicore] void foo(...)
{
// declares an array of 4 floats in the private address space.
// unlike OpenCL, CCE don't have explicit __private address space qualifier.
float x[4];
}
地址空间限定符不能用于非指针返回类型、非指针函数参数、函数类型,同一个类型上不允许使用多个地址空间限定符。以下是具体的代码示例:
// OK.
[aicore] int f() {...}
// Error. Address space qualifier cannot be used with a non-pointer return type.
__ubuf__ [aicore] int f() { ... }
// OK. Address space qualifier can be used with a pointer return type.
__ubuf__ [aicore] int *f() { ... }
// Error. Multiple address spaces specified for a type.
__ubuf__ __gm__ int i;
// OK. The first address space qualifies the object pointed to and the second
// qualifies the pointer.
__ubuf__ int * __gm__ ptr;
private地址空间
private地址空间是大多数变量的默认地址空间,尤其是局部变量。以下是具体的代码示例:
// m is in a specific kernel parameter address space,
// it's physical location is implementation determined.
__global__ [aicore] void foo(int m) {
// OK. i is an int variable allocated in private address space
int i;
}
[aicore] void bar(int k) { //OK. k is in private address space
// OK. i is an int variable allocated in private address space
int i;
}
__gm__地址空间
__gm__地址空间限定符用来表示分配于设备侧全局内存的对象,全局内存对象可以声明为标量或用户自定义结构体的指针。以下是具体的代码示例:
__gm__ int *var; // var point to an array of int elements
typedef struct {
float a[3];
int b[2];
} foo_t;
__gm__ foo_t *info; // info point to an array of foo_t elements
__ubuf__地址空间
__ubuf__地址空间用来描述存储于AICore核内UB存储空间的变量。以下是具体的代码示例:
__global__ [aicore] void foo() {
// ptr is in private address space, point to __ubuf__
__ubuf__ int *ptr;
}
__ca__, __cb__, __cc__, __cbuf__地址空间
__ca__, __cb__, __cc__, __cbuf__地址空间限定符分别用于描述AICore核内的L0A, L0B, L0C, L1存储空间,这些地址空间主要用于特定的DMA指令访问,不具备标量直接访问能力。以下是具体的代码示例:
__global__ [aicore]
void foo(__ca__ int * ptr) { // Error. Cannot have __ca__
// qualifier in kernel arguments
// OK
__ca__ int *ptr;
}
父主题: CCE Intrinsic特性