in src/blocksparse_conv_op.cc [267:372]
virtual void Compute(OpKernelContext* ctx) override {
const Tensor& grid_lut = ctx->input(mode_);
const Tensor& mpq_lut = ctx->input(mode_ == 1 ? 4 : 3);
const Tensor& ck_lut = ctx->input(5);
const Tensor& a = ctx->input(6);
const Tensor& b = ctx->input(7);
float alpha = 1.0f;
int gridX = grid_lut.dim_size(0);
int rank = b.dims();
int N = b.dim_size(0);
int zero, gridY;
TensorShape c_shape;
if (mode_ == 0)
{
zero = N * zero_;
gridY = N;
c_shape.AddDim(N);
c_shape.AddDim(K_);
if (rank == 5) c_shape.AddDim(MPQ_[0]);
if (rank >= 4) c_shape.AddDim(MPQ_[1]);
c_shape.AddDim(MPQ_[2]);
}
else if (mode_ == 1)
{
zero = N * zero_;
gridY = N;
c_shape.AddDim(N);
c_shape.AddDim(C_);
if (rank == 5) c_shape.AddDim(DHW_[0]);
if (rank >= 4) c_shape.AddDim(DHW_[1]);
c_shape.AddDim(DHW_[2]);
}
else
{
zero = zero_;
gridY = 1;
for (std::vector<int32>::iterator it = dimF_.begin() ; it != dimF_.end(); ++it)
c_shape.AddDim(*it);
}
Tensor* c = nullptr;
OP_REQUIRES_OK(ctx, ctx->allocate_output(0, c_shape, &c));
CUdeviceptr c_ptr = (CUdeviceptr)c->flat<CT>().data();
CUdeviceptr grid_ptr = (CUdeviceptr)grid_lut.flat<int32>().data();
CUdeviceptr mpq_ptr = (CUdeviceptr)mpq_lut.flat<int32>().data();
CUdeviceptr ck_ptr = (CUdeviceptr)ck_lut.flat<int32>().data();
CUdeviceptr a_ptr = (CUdeviceptr)a.flat<AT>().data();
CUdeviceptr b_ptr = (CUdeviceptr)b.flat<BT>().data();
OP_REQUIRES_OK(ctx, GetKernel(kernel_name_, &kernel_));
CUstream stream = ((CUDAStream*)ctx->op_device_context()->stream()->implementation())->cuda_stream();
void *args[] = {
&grid_ptr, &mpq_ptr, &ck_ptr, &c_ptr, &a_ptr, &b_ptr, &alpha,
&trs_, &magic_trs_, &shift_trs_, &cdhw_, &kmpq_, &N, &size_f_
};
CUresult res;
if (zero > 0)
{
res = cuMemsetD8Async(c_ptr, 0, zero, stream);
if (res != CUDA_SUCCESS)
{
const char* errstr;
cuGetErrorString(res, &errstr);
OP_REQUIRES(ctx, false, errors::Internal("cuMemsetD8Async Error: ", errstr, " bytes: ", zero));
}
}
res = cuLaunchKernel(kernel_, gridX, gridY, 1, threads_, 1, 1, share_, stream, args, NULL);
if (res != CUDA_SUCCESS)
{
const char* errstr;
cuGetErrorString(res, &errstr);
char params[256];
sprintf(params, "m:%d(%5d,%5d:%5d), grid:%p, mpq:%p, ck:%p, c:%p, a:%p, b:%p, C:%5d, K:%5d, N:%3d %s\n",
mode_, gridX, gridY, share_,
(void*)grid_ptr, (void*)mpq_ptr, (void*)ck_ptr,
(void*)c_ptr, (void*)a_ptr, (void*)b_ptr,
C_, K_, N, kernel_name_.c_str());
OP_REQUIRES(ctx, false, errors::Internal("cuLaunchKernel Error: ", errstr, "\nParams: ", params ));
//OP_REQUIRES(ctx, false, errors::Internal("cuLaunchKernel Error: ", errstr));
}
if (debug_)
{
res = cuStreamSynchronize(stream);
if (res != CUDA_SUCCESS)
{
const char* errstr;
cuGetErrorString(res, &errstr);
char params[256];
sprintf(params, "m:%d(%5d,%5d:%5d), grid:%p, mpq:%p, ck:%p, c:%p, a:%p, b:%p, C:%5d, K:%5d, N:%3d %s\n",
mode_, gridX, gridY, share_,
(void*)grid_ptr, (void*)mpq_ptr, (void*)ck_ptr,
(void*)c_ptr, (void*)a_ptr, (void*)b_ptr,
C_, K_, N, kernel_name_.c_str());
OP_REQUIRES(ctx, false, errors::Internal("Cuda Error: ", errstr, "\nParams: ", params ));
}
}
}