extends cpp

snippet kern "Kernel definition"
	__global__ void ${1:kernel}(${2:void}) {
		${0:// TODO: Implement}
	}

snippet dev "Device function definition"
	__device__ ${1:int} ${2:foo}(${3:void}) {
		${0:// TODO: Implement}
		return 0;
	}
	
snippet call "Kernel call"
	${1:kernel}<<<${2:args}>>>(${3});${0}

snippet sync "Synchonize threads"
	__syncthreads();

snippet tid "Thread Index"
	threadIdx.${0}

snippet bid "Block Index"
	blockIdx.${0}

snippet bdim "Block Dimension"
	blockDim.${0}

snippet ii "Get current index (1D)"
	int ${1:index} = threadIdx.${2:x} + blockIdx.$2 * blockDim.$2;

snippet ix "Get current X index (1D)"
	int ${1:x} = threadIdx.x + blockIdx.x * blockDim.x;

snippet iy "Get current Y index (1D)"
	int ${1:y} = threadIdx.y + blockIdx.y * blockDim.y;

snippet iz "Get current Z index (1D)"
	int ${1:z} = threadIdx.z + blockIdx.z * blockDim.z;

snippet ixy "Get current X,Y index (2D)"
	int ${1:x} = threadIdx.x + blockIdx.x * blockDim.x;
	int ${2:y} = threadIdx.y + blockIdx.y * blockDim.y;

snippet ixz "Get current X,Z index (2D)"
	int ${1:x} = threadIdx.x + blockIdx.x * blockDim.x;
	int ${3:z} = threadIdx.z + blockIdx.z * blockDim.z;

snippet iyz "Get current Y,Z index (2D)"
	int ${2:y} = threadIdx.y + blockIdx.y * blockDim.y;
	int ${3:z} = threadIdx.z + blockIdx.z * blockDim.z;

snippet ixyz "Get current X,Y,Z index (3D)"
	int ${1:x} = threadIdx.x + blockIdx.x * blockDim.x;
	int ${2:y} = threadIdx.y + blockIdx.y * blockDim.y;
	int ${3:z} = threadIdx.z + blockIdx.z * blockDim.z;

snippet share "Shared memory declaration"
	__shared__ ${1:int} ${2:memo}[${3:SIZE}];${0}