CUTLASS 3.6.0 (#1850)
* v3.6 * update changelog * update readme * fix typo * fixing typos * hopper gemm with weight prefetch --------- Co-authored-by: yuzhai <yuzhai@nvidia.com> Co-authored-by: Haicheng Wu <haichengw@nvidia.com>
This commit is contained in:
co-authored by
yuzhai
Haicheng Wu
parent
0837a2a00a
commit
cc3c29a81a
@@ -103,6 +103,7 @@ void run_test_integer_range_all() {
|
||||
|
||||
for (int i = 0; i < kN; ++i) {
|
||||
source.host_view().at({0, i}) = Source(kIntSourceMin + (i % kIntRange));
|
||||
|
||||
}
|
||||
|
||||
source.sync_device();
|
||||
@@ -116,12 +117,14 @@ void run_test_integer_range_all() {
|
||||
|
||||
// Verify conversion
|
||||
bool passed = true;
|
||||
|
||||
for (int i = 0; i < kN; ++i) {
|
||||
if(!(float(destination.host_view().at({0, i})) == float(source.host_view().at({0, i})))) {
|
||||
passed = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
EXPECT_TRUE(passed) << " FastNumericArrayConverter failed";
|
||||
|
||||
// Print out results for the failed conversion.
|
||||
|
||||
@@ -497,20 +497,18 @@ __global__ void
|
||||
test_cutlass_maximum(cutlass::half_t const* in1, cutlass::half_t const* in2, cutlass::half_t* out)
|
||||
{
|
||||
{
|
||||
constexpr bool propagate_NaN = true;
|
||||
cutlass::maximum<cutlass::half_t, propagate_NaN> op;
|
||||
if (threadIdx.x == 0 && threadIdx.y == 0 && threadIdx.z == 0
|
||||
&& blockIdx.x == 0 && blockIdx.y == 0 && blockIdx.z == 0) {
|
||||
*out = op(*in1, *in2);
|
||||
}
|
||||
constexpr bool propagate_NaN = true;
|
||||
cutlass::maximum<cutlass::half_t, propagate_NaN> op;
|
||||
if (threadIdx.x == 0 && threadIdx.y == 0 && threadIdx.z == 0
|
||||
&& blockIdx.x == 0 && blockIdx.y == 0 && blockIdx.z == 0) {
|
||||
*out = op(*in1, *in2);
|
||||
}
|
||||
{
|
||||
constexpr bool propagate_NaN = false;
|
||||
cutlass::maximum<cutlass::half_t, propagate_NaN> op;
|
||||
if (threadIdx.x == 0 && threadIdx.y == 0 && threadIdx.z == 0
|
||||
&& blockIdx.x == 0 && blockIdx.y == 0 && blockIdx.z == 0) {
|
||||
*out = op(*in1, *in2);
|
||||
}
|
||||
}
|
||||
constexpr bool propagate_NaN = false;
|
||||
cutlass::maximum<cutlass::half_t, propagate_NaN> op;
|
||||
if (threadIdx.x == 0 && threadIdx.y == 0 && threadIdx.z == 0
|
||||
&& blockIdx.x == 0 && blockIdx.y == 0 && blockIdx.z == 0) {
|
||||
*out = op(*in1, *in2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -543,7 +541,7 @@ TEST(Functional, maximum_half_host_dont_propagate_NaN) {
|
||||
EXPECT_EQ(result, y);
|
||||
}
|
||||
|
||||
TEST(Function, maximum_half_device) {
|
||||
TEST(FUnction, maximum_half_device) {
|
||||
using Tensor = cutlass::HostTensor<cutlass::half_t, cutlass::layout::RowMajor>;
|
||||
|
||||
Tensor in1({1, 1});
|
||||
|
||||
@@ -217,6 +217,15 @@ TEST(NumericConversion, f32_to_fe4m3_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f32_to_fe4m3_rn_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = float;
|
||||
const char source_name[] = "float";
|
||||
using Destination = cutlass::float_e4m3_t;
|
||||
const char dest_name[] = "float_e4m3_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f32_to_fe4m3_rn_array) {
|
||||
int const kN = 27;
|
||||
using Source = float;
|
||||
@@ -235,6 +244,15 @@ TEST(NumericConversion, f32_to_fe5m2_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f32_to_fe5m2_rn_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = float;
|
||||
const char source_name[] = "float";
|
||||
using Destination = cutlass::float_e5m2_t;
|
||||
const char dest_name[] = "float_e5m2_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f32_to_fe5m2_rn_array) {
|
||||
int const kN = 27;
|
||||
using Source = float;
|
||||
@@ -253,6 +271,15 @@ TEST(NumericConversion, f16_to_fe4m3_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f16_to_fe4m3_rn_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = cutlass::half_t;
|
||||
const char source_name[] = "half_t";
|
||||
using Destination = cutlass::float_e4m3_t;
|
||||
const char dest_name[] = "float_e4m3_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f16_to_fe4m3_rn_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::half_t;
|
||||
@@ -271,6 +298,15 @@ TEST(NumericConversion, f16_to_fe5m2_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f16_to_fe5m2_rn_2_elements) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::half_t;
|
||||
const char source_name[] = "half_t";
|
||||
using Destination = cutlass::float_e5m2_t;
|
||||
const char dest_name[] = "float_e5m2_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, f16_to_fe5m2_rn_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::half_t;
|
||||
@@ -289,6 +325,15 @@ TEST(NumericConversion, bf16_to_fe4m3_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, bf16_to_fe4m3_rn_2_elements) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::bfloat16_t;
|
||||
const char source_name[] = "bfloat16_t";
|
||||
using Destination = cutlass::float_e4m3_t;
|
||||
const char dest_name[] = "float_e4m3_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, bf16_to_fe4m3_rn_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::bfloat16_t;
|
||||
@@ -307,6 +352,15 @@ TEST(NumericConversion, bf16_to_fe5m2_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, bf16_to_fe5m2_rn_2_elements) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::bfloat16_t;
|
||||
const char source_name[] = "bfloat16_t";
|
||||
using Destination = cutlass::float_e5m2_t;
|
||||
const char dest_name[] = "float_e5m2_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, bf16_to_fe5m2_rn_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::bfloat16_t;
|
||||
@@ -327,6 +381,15 @@ TEST(NumericConversion, fe4m3_to_fe5m2_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_fe5m2_2_elements) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
const char source_name[] = "float_e4m3_t";
|
||||
using Destination = cutlass::float_e5m2_t;
|
||||
const char dest_name[] = "float_e5m2_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_fe5m2_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
@@ -345,6 +408,15 @@ TEST(NumericConversion, fe5m2_to_fe4m3_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_fe4m3_2_elements) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
const char source_name[] = "float_e5m2_t";
|
||||
using Destination = cutlass::float_e4m3_t;
|
||||
const char dest_name[] = "float_e4m3_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_fe4m3_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
@@ -375,6 +447,15 @@ TEST(NumericConversion, f32x8_to_s8x8_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_f32_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
const char source_name[] = "float_e4m3_t";
|
||||
using Destination = float;
|
||||
const char dest_name[] = "float";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_f32_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
@@ -384,6 +465,15 @@ TEST(NumericConversion, fe4m3_to_f32_array) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_f32_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
const char source_name[] = "float_e5m2_t";
|
||||
using Destination = float;
|
||||
const char dest_name[] = "float";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_f32_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
@@ -402,6 +492,15 @@ TEST(NumericConversion, fe4m3_to_f16_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_f16_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
const char source_name[] = "float_e4m3_t";
|
||||
using Destination = cutlass::half_t;
|
||||
const char dest_name[] = "half_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_f16_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
@@ -420,6 +519,15 @@ TEST(NumericConversion, fe5m2_to_f16_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_f16_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
const char source_name[] = "float_e5m2_t";
|
||||
using Destination = cutlass::half_t;
|
||||
const char dest_name[] = "half_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_f16_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
@@ -438,6 +546,15 @@ TEST(NumericConversion, fe4m3_to_bf16_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_bf16_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
const char source_name[] = "float_e4m3_t";
|
||||
using Destination = cutlass::bfloat16_t;
|
||||
const char dest_name[] = "bfloat16_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe4m3_to_bf16_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e4m3_t;
|
||||
@@ -456,6 +573,15 @@ TEST(NumericConversion, fe5m2_to_bf16_rn) {
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_bf16_2_elements) {
|
||||
int const kN = 2;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
const char source_name[] = "float_e5m2_t";
|
||||
using Destination = cutlass::bfloat16_t;
|
||||
const char dest_name[] = "bfloat16_t";
|
||||
test::core::kernel::run_test<Destination, Source, kN>(dest_name, source_name);
|
||||
}
|
||||
|
||||
TEST(NumericConversion, fe5m2_to_bf16_array) {
|
||||
int const kN = 27;
|
||||
using Source = cutlass::float_e5m2_t;
|
||||
|
||||
Reference in New Issue
Block a user