Я работаю над реализацией 256-битного числа арифметики в CUDA для таких операций, как добавление с распространением переноски, вычитание с заимствованием и сравнение. Первоначально я определил пользовательскую структуру для представления 256-битного номера: < /p>
struct big_number_t {
unsigned long long s0; // Least significant limb
unsigned long long s1;
unsigned long long s2;
unsigned long long s3; // Most significant limb
};
< /code>
Однако я наткнулся на ссылки на типы векторов в CUDA и обнаружил, что существуют встроенные типы, такие как Ulong4 и Ulonglong4. (https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#vector-types-allignment-requirements-in device-code) и я не могу определить, какой из этих типов правильный. Нагрузки/хранилища по сравнению с пользовательской структурой? Поскольку распространение переноски является последовательным, я не уверен, что типы векторов предлагают здесь какие-либо преимущества. Мои основные проблемы.struct big_number_t {
unsigned long long s0;
unsigned long long s1;
unsigned long long s2;
unsigned long long s3;
};
__device__ big_number_t bn_add(const big_number_t& a, const big_number_t& b, unsigned long long& carry_out) {
big_number_t result;
unsigned long long carry = 0;
result.s0 = a.s0 + b.s0;
carry = (result.s0 < a.s0) ? 1 : 0;
unsigned long long sum = a.s1 + b.s1 + carry;
carry = (sum < a.s1 || (carry && sum == a.s1)) ? 1 : 0;
result.s1 = sum;
sum = a.s2 + b.s2 + carry;
carry = (sum < a.s2 || (carry && sum == a.s2)) ? 1 : 0;
result.s2 = sum;
sum = a.s3 + b.s3 + carry;
carry = (sum < a.s3 || (carry && sum == a.s3)) ? 1 : 0;
result.s3 = sum;
carry_out = carry;
return result;
}
заменит ли замену big_number_t ulonglong4 или ulong4 предлагать какие -либо преимущества производительности, или это в основном вопрос предпочтения? Спасибо!
Я работаю над реализацией 256-битного числа арифметики в CUDA для таких операций, как добавление с распространением переноски, вычитание с заимствованием и сравнение. Первоначально я определил пользовательскую структуру для представления 256-битного номера: < /p> [code]struct big_number_t { unsigned long long s0; // Least significant limb unsigned long long s1; unsigned long long s2; unsigned long long s3; // Most significant limb }; < /code> Однако я наткнулся на ссылки на типы векторов в CUDA и обнаружил, что существуют встроенные типы, такие как Ulong4 и Ulonglong4. (https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#vector-types-allignment-requirements-in device-code) и я не могу определить, какой из этих типов правильный. Нагрузки/хранилища по сравнению с пользовательской структурой? Поскольку распространение переноски является последовательным, я не уверен, что типы векторов предлагают здесь какие-либо преимущества. Мои основные проблемы.struct big_number_t { unsigned long long s0; unsigned long long s1; unsigned long long s2; unsigned long long s3; };
__device__ big_number_t bn_add(const big_number_t& a, const big_number_t& b, unsigned long long& carry_out) { big_number_t result; unsigned long long carry = 0;
carry_out = carry; return result; } [/code] заменит ли замену big_number_t ulonglong4 или ulong4 предлагать какие -либо преимущества производительности, или это в основном вопрос предпочтения? Спасибо!