/usr/local/lib64/python3.6/site-packages/torch/include/THC
NameSizeModeActions
generic/-0755rm
THC.h3280644editdlrm
THCAllocator.h3700644editdlrm
THCAsmUtils.cuh34440644editdlrm
THCAtomics.cuh130940644editdlrm
THCCachingHostAllocator.h12540644editdlrm
THCDeviceTensor-inl.cuh115150644editdlrm
THCDeviceTensor.cuh161600644editdlrm
THCDeviceTensorUtils-inl.cuh44970644editdlrm
THCDeviceTensorUtils.cuh27200644editdlrm
THCDeviceUtils.cuh9420644editdlrm
THCGeneral.h27410644editdlrm
THCGeneral.hpp7430644editdlrm
THCGenerateAllTypes.h9580644editdlrm
THCGenerateBFloat16Type.h5150644editdlrm
THCGenerateBoolType.h4490644editdlrm
THCGenerateByteType.h4190644editdlrm
THCGenerateCharType.h4180644editdlrm
THCGenerateComplexDoubleType.h5330644editdlrm
THCGenerateComplexFloatType.h5260644editdlrm
THCGenerateComplexTypes.h2980644editdlrm
THCGenerateDoubleType.h4640644editdlrm
THCGenerateFloatType.h5500644editdlrm
THCGenerateFloatTypes.h7790644editdlrm
THCGenerateHalfType.h4810644editdlrm
THCGenerateIntType.h4140644editdlrm
THCGenerateLongType.h4190644editdlrm
THCGenerateShortType.h4240644editdlrm
THCIntegerDivider.cuh40950644editdlrm
THCNumerics.cuh198130644editdlrm
THCScanUtils.cuh47890644editdlrm
THCSleep.h2320644editdlrm
THCStorage.h4870644editdlrm
THCStorage.hpp8460644editdlrm
THCStorageCopy.h4660644editdlrm
THCTensor.h6230644editdlrm
THCTensor.hpp10700644editdlrm
THCTensorCopy.h4670644editdlrm
THCTensorCopy.hpp6000644editdlrm
THCTensorMathReduce.cuh6640644editdlrm
THCThrustAllocator.cuh6180644editdlrm
Edit: /usr/local/lib64/python3.6/site-packages/torch/include/THC/THCScanUtils.cuh (4789B)
#ifndef THC_SCAN_UTILS_INC #define THC_SCAN_UTILS_INC #include #include #include // Collection of in-kernel scan / prefix sum utilities // Extends the above Inclusive Scan to support segments. It has the same properties // but also takes a flag array that indicates the starts of "segments", i.e. individual // units to scan. For example, consider the following (+)-scan that is segmented: // // Input: [1, 3, 2, 4, 1, 2, 3, 2, 1, 4] // Flags: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0] // Output: 1 4 6 4 5 2 3 5 1 5 // // So we see that each "flag" resets the scan to that index. template __device__ void segmentedInclusivePrefixScan(T *smem, bool *bmem, BinaryOp binop) { // Reduce step ("upsweep") #pragma unroll for (int stride = 1; stride < Power2ScanSize; stride <<= 1) { int index = (threadIdx.x + 1) * stride * 2 - 1; if (index < Power2ScanSize) { smem[index] = bmem[index] ? smem[index] : binop(smem[index], smem[index - stride]); bmem[index] = bmem[index] | bmem[index - stride]; } __syncthreads(); } // Post-reduce step ("downsweep") #pragma unroll for (int stride = Power2ScanSize / 4; stride > 0; stride >>= 1) { int index = (threadIdx.x + 1) * stride * 2 - 1; if ((index + stride) < Power2ScanSize) { smem[index + stride] = bmem[index + stride] ? smem[index + stride] : binop(smem[index + stride], smem[index]); bmem[index + stride] = bmem[index + stride] | bmem[index]; } __syncthreads(); } } // Inclusive prefix sum using shared memory template __device__ void inclusivePrefixScan(T* smem, T in, T* out, BinaryFunction binop) { // FIXME: this is a slow, simple implementation; need up/down sweep, // prevent smem conflicts smem[threadIdx.x] = in; __syncthreads(); for (int offset = 1; offset < blockDim.x; offset *= 2) { T val = 0; if (threadIdx.x >= offset) { val = binop(smem[threadIdx.x - offset], smem[threadIdx.x]); } __syncthreads(); if (threadIdx.x >= offset) { smem[threadIdx.x] = val; } __syncthreads(); } *out = smem[threadIdx.x]; // Prevent write-after-read dependencies on smem usage above if necessary if (KillWARDependency) { __syncthreads(); } } // Exclusive prefix sum using shared memory template __device__ void exclusivePrefixScan(T* smem, T in, T* out, T* carry, BinaryFunction binop) { // FIXME: crappy implementation // We kill write-after-read dependencies separately below, hence the `false` inclusivePrefixScan(smem, in, out, binop); *out -= in; *carry = smem[blockDim.x - 1]; // Prevent write-after-read dependencies on smem usage above if necessary if (KillWARDependency) { __syncthreads(); } } // Inclusive prefix sum for binary vars using intra-warp voting + // shared memory template __device__ void inclusiveBinaryPrefixScan(T* smem, bool in, T* out, BinaryFunction binop) { // Within-warp, we use warp voting. #if defined (__HIP_PLATFORM_HCC__) unsigned long long int vote = WARP_BALLOT(in); T index = __popcll(getLaneMaskLe() & vote); T carry = __popcll(vote); #else T vote = WARP_BALLOT(in); T index = __popc(getLaneMaskLe() & vote); T carry = __popc(vote); #endif int warp = threadIdx.x / C10_WARP_SIZE; // Per each warp, write out a value if (getLaneId() == 0) { smem[warp] = carry; } __syncthreads(); // Sum across warps in one thread. This appears to be faster than a // warp shuffle scan for CC 3.0+ if (threadIdx.x == 0) { int current = 0; for (int i = 0; i < blockDim.x / C10_WARP_SIZE; ++i) { T v = smem[i]; smem[i] = binop(smem[i], current); current = binop(current, v); } } __syncthreads(); // load the carry from the preceding warp if (warp >= 1) { index = binop(index, smem[warp - 1]); } *out = index; if (KillWARDependency) { __syncthreads(); } } // Exclusive prefix sum for binary vars using intra-warp voting + // shared memory template __device__ void exclusiveBinaryPrefixScan(T* smem, bool in, T* out, T* carry, BinaryFunction binop) { inclusiveBinaryPrefixScan(smem, in, out, binop); // Inclusive to exclusive *out -= (T) in; // The outgoing carry for all threads is the last warp's sum *carry = smem[THCCeilDiv(blockDim.x, C10_WARP_SIZE) - 1]; if (KillWARDependency) { __syncthreads(); } } #endif // THC_SCAN_UTILS_INC