mirror of https://github.com/GOSTSec/ccminer
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.0 KiB
113 lines
3.0 KiB
/* |
|
* Copyright 2008-2012 NVIDIA Corporation |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include <thrust/detail/config.h> |
|
|
|
namespace thrust |
|
{ |
|
namespace system |
|
{ |
|
namespace detail |
|
{ |
|
namespace internal |
|
{ |
|
|
|
template <typename IndexType> |
|
class index_range |
|
{ |
|
public: |
|
typedef IndexType index_type; |
|
|
|
__host__ __device__ |
|
index_range(index_type begin, index_type end) : m_begin(begin), m_end(end) {} |
|
|
|
__host__ __device__ |
|
index_type begin(void) const { return m_begin; } |
|
|
|
__host__ __device__ |
|
index_type end(void) const { return m_end; } |
|
|
|
__host__ __device__ |
|
index_type size(void) const { return m_end - m_begin; } |
|
|
|
private: |
|
index_type m_begin; |
|
index_type m_end; |
|
}; |
|
|
|
template <typename IndexType> |
|
class uniform_decomposition |
|
{ |
|
public: |
|
typedef IndexType index_type; |
|
typedef index_range<index_type> range_type; |
|
|
|
uniform_decomposition(index_type N, index_type granularity, index_type max_intervals) |
|
: m_N(N), |
|
m_intervals((N + granularity - 1) / granularity), |
|
m_threshold(0), |
|
m_small_interval(granularity), |
|
m_large_interval(0) |
|
{ |
|
if(m_intervals > max_intervals) |
|
{ |
|
m_small_interval = granularity * (m_intervals / max_intervals); |
|
m_large_interval = m_small_interval + granularity; |
|
m_threshold = m_intervals % max_intervals; |
|
m_intervals = max_intervals; |
|
} |
|
} |
|
|
|
__host__ __device__ |
|
index_range<index_type> operator[](const index_type& i) const |
|
{ |
|
if (i < m_threshold) |
|
{ |
|
index_type begin = m_large_interval * i; |
|
index_type end = begin + m_large_interval; |
|
return range_type(begin, end); |
|
} |
|
else |
|
{ |
|
index_type begin = m_large_interval * m_threshold + m_small_interval * (i - m_threshold); |
|
index_type end = (begin + m_small_interval < m_N) ? begin + m_small_interval : m_N; |
|
return range_type(begin, end); |
|
} |
|
} |
|
|
|
__host__ __device__ |
|
index_type size(void) const |
|
{ |
|
return m_intervals; |
|
} |
|
|
|
private: |
|
|
|
index_type m_N; |
|
index_type m_intervals; |
|
index_type m_threshold; |
|
index_type m_small_interval; |
|
index_type m_large_interval; |
|
}; |
|
|
|
|
|
} // end namespace internal |
|
} // end namespace detail |
|
} // end namespace system |
|
} // end namespace thrust |
|
|
|
|