lightzhan-intellif opened a new issue, #13695:
URL: https://github.com/apache/tvm/issues/13695
Hi, all
I have a program like this:
```python
import numpy as np
from tvm.script import tir as T
import tvm
@T.prim_func
def test_case(A: T.Buffer[(1, ), "uint8"], B: T.Buffer[(1, ), "float32"]):
B[0] = A[0]
if __name__ == "__main__":
compiled = tvm.build(test_case, target="llvm")
in_data = np.empty((1,), dtype=np.uint8)
in_data[0] = 100
out_data = np.empty((1,), dtype=np.float32)
A_tvm = tvm.nd.array(in_data, tvm.cpu(0))
B_tvm = tvm.nd.array(out_data, tvm.cpu(0))
compiled(A_tvm, B_tvm)
print(B_tvm.numpy())
```
I just want to assign a value `100` typed uint8 to an address of type float.
In python, we should get the result `100` in the B[0], but it give me a weird
result `[2.0000238]`.
I change the target to `c`, and get the following code:
```c
// tvm target: c -keys=cpu
#define TVM_EXPORTS
#include "tvm/runtime/c_runtime_api.h"
#include "tvm/runtime/c_backend_api.h"
#include <math.h>
#ifdef __cplusplus
extern "C"
#endif
TVM_DLL int32_t default_function(void* args, int32_t* arg_type_ids, int32_t
num_args, void* out_ret_value, int32_t* out_ret_tcode, void* resource_handle) {
void* arg_A_handle = (((TVMValue*)args)[0].v_handle);
int32_t arg_A_handle_code = arg_type_ids[0];
void* arg_B_handle = (((TVMValue*)args)[1].v_handle);
int32_t arg_B_handle_code = arg_type_ids[1];
void* A = (((DLTensor*)arg_A_handle)[0].data);
void* arg_A_handle_shape = (((DLTensor*)arg_A_handle)[0].shape);
void* arg_A_handle_strides = (((DLTensor*)arg_A_handle)[0].strides);
int32_t dev_id = (((DLTensor*)arg_A_handle)[0].device.device_id);
void* B = (((DLTensor*)arg_B_handle)[0].data);
void* arg_B_handle_shape = (((DLTensor*)arg_B_handle)[0].shape);
void* arg_B_handle_strides = (((DLTensor*)arg_B_handle)[0].strides);
if (!(arg_A_handle_strides == NULL)) {
}
if (!(arg_B_handle_strides == NULL)) {
}
*(uint8_t*)(((float*)B) + 0) = ((uint8_t*)A)[0];
return 0;
}
// CodegenC: NOTE: Auto-generated entry function
#ifdef __cplusplus
extern "C"
#endif
TVM_DLL int32_t __tvm_main__(void* args, int* arg_type_ids, int num_args,
void* out_ret_value, int* out_ret_tcode, void* resource_handle) {
return default_function(args, arg_type_ids, num_args, out_ret_value,
out_ret_tcode, resource_handle);
}
```
From the code , you can see that tvm does not do any casting to the
assignment operation.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]