-
Notifications
You must be signed in to change notification settings - Fork 78
Description
Problem Description
The standard math operators don't work on vector types as defined by amd_hip_vector_types.h
when using g++
as host compiler.
Operating System
Debian trixie/sid
CPU
AMD Ryzen 7 PRO 6850H with Radeon Graphics
GPU
AMD Instinct MI300X, AMD Instinct MI300A, AMD Instinct MI250X, AMD Instinct MI250, AMD Instinct MI210, AMD Instinct MI100, AMD Radeon Pro W7900, AMD Radeon Pro W6800, AMD Radeon Pro V620, AMD Radeon Pro VII, AMD Radeon RX 7900 XTX, AMD Radeon RX 7900 XT, AMD Radeon VII
ROCm Version
ROCm 6.0.0
ROCm Component
HIP
Steps to Reproduce
A simple test case reproducing the issue is:
#include <hip/hip_vector_types.h>
#include <iostream>
int main() {
const float4 v1{1.0f, 2.0f, 3.0f, 4.0f};
const float4 v2{4.0f, 3.0f, 2.0f, 1.0f};
float4 mul = v1*v2;
std::cout << mul.x << " " << mul.y << " " << mul.z << " " << mul.w << std::endl;
}
This builds correctly with hipcc
or clang++
, but not with g++
, where the following error is shown instead:
g++ -Wall -Wextra -D__HIP_PLATFORM_HCC__= -D__HIP_PLATFORM_AMD__= -I/opt/rocm-6.0.3/include -I/opt/rocm-6.0.3/lib/llvm/lib/clang/17.0.0 vecmul.cc -lm -o vecmul
In file included from /opt/rocm-6.0.3/include/hip/hip_vector_types.h:33,
from vecmul.cc:1:
/opt/rocm-6.0.3/include/hip/amd_detail/amd_hip_vector_types.h: In instantiation of ‘HIP_vector_type<T, rank>& HIP_vector_type<T, rank>::operator*=(const HIP_vector_type<T, rank>&) [with T = float; unsigned int rank = 4]’:
/opt/rocm-6.0.3/include/hip/amd_detail/amd_hip_vector_types.h:551:39: required from ‘constexpr HIP_vector_type<float, 4> operator*(HIP_vector_type<float, 4>, const HIP_vector_type<float, 4>&)’
vecmul.cc:7:18: required from here
/opt/rocm-6.0.3/include/hip/amd_detail/amd_hip_vector_types.h:544:18: error: invalid operands of types ‘HIP_vector_base<float, 4>::Native_vec_’ {aka ‘float [4]’} and ‘const float*’ to binary ‘operator*’
544 | data *= x.data;
| ~~~~~^~~~~~~~~
/opt/rocm-6.0.3/include/hip/amd_detail/amd_hip_vector_types.h:544:18: note: in evaluation of ‘operator*=(using HIP_vector_base<float, 4>::Native_vec_ = float [4] {aka float [4]}, const float*)’
make: *** [Makefile:11: vecmul] Error 1
(Optional for Linux users) Output of /opt/rocm/bin/rocminfo --support
No response
Additional Information
This is most likely due to the way __NATIVE_VECTOR__
gets defined, which in this case becomes
#define __NATIVE_VECTOR__(n, T) T[n]
The operators need to be redefined to something like
__HOST_DEVICE__
HIP_vector_type& operator*=(const HIP_vector_type& x) noexcept
{
#if __has_attribute(ext_vector_type)
data *= x.data;
#else
for (auto i = 0u; i < rank; ++i)
data[i] *= x.data[i];
#endif
return *this;
}
and similarly for all other operators.
Some notes:
-
this issue has been present since HIP version 4.2 at least and is still present in 6.0.3
-
I had previously submitted a patch to fix this and a number of other issues to the old
ROCm/hipamd
repository. -
this is independent from the specific GPU, it's a header-level issue.