Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
Zedboard zynq-7000 Opencl floating point invalid cast from type 'double*' to type 'double'
我是 Xilinx 开发领域的新手,我正在准备 zedboard 的硕士学位。我正在尝试使用 Vivado HLS 在 Zedboard 上开发一个带有 Opencl 的卷积加速器。
我创建了OpenCL块。
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#include <clc.h>
__kernel void __attribute__ ((reqd_work_group_size(26,1,1)))
conv_openCL( __global double*a, __global double*c) {
int i = get_global_id(0);
c[i] = a[i] * 2 ;
}
然后我在 Vivado 中使用它来创建架构: 图片 1
将其导出到 Vivado SDK 并从此处使用和修改代码后。 OpenCL 块无法正确执行,我不知道原因。
所以我的问题是为什么当我用浮点数或双精度替换 int 类型时它会给我一个错误。
旧代码:
volatile char *control = (volatile char*)0x43C00000;
volatile int *wg_x = (volatile int*)0x43C00010;
volatile int *wg_y = (volatile int*)0x43C00018;
volatile int *wg_z = (volatile int*)0x43C00020;
volatile int *o_x = (volatile int*)0x43C00028;
volatile int *o_y = (volatile int*)0x43C00030;
volatile int *o_z = (volatile int*)0x43C00038;
volatile int *a_addr = (volatile int*) 0x43C00040;
volatile int *c_addr = (volatile int*)0x43C00048;
...
void main(){
...
int* a;
int*c;
a = (int*)malloc(WG_SIZE_X *sizeof(int));
c = (int*)malloc(WG_SIZE_X *sizeof(int));
*a_addr =(unsigned int)a;
*c_addr =(unsigned int)c;
...
}
我的代码:
volatile char *control = (volatile char*)0x43C00000;
volatile int *wg_x = (volatile int*)0x43C00010;
volatile int *wg_y = (volatile int*)0x43C00018;
volatile int *wg_z = (volatile int*)0x43C00020;
volatile int *o_x = (volatile int*)0x43C00028;
volatile int *o_y = (volatile int*)0x43C00030;
volatile int *o_z = (volatile int*)0x43C00038;
volatile double *a_addr = (volatile double*) 0x43C00040;
volatile double *c_addr = (volatile double*)0x43C00048;
...
void main(){
...
int* a;
int*c;
a = (double*)malloc(WG_SIZE_X *sizeof(double));
c = (double*)malloc(WG_SIZE_X *sizeof(double));
*a_addr =(double)a;
*c_addr =(double)c;
...
}
它给了我这个错误:
错误图像
从类型"双精度*"到类型"双精度"的转换无效
请帮助我,我想将"a"数组的内容传输到 OpenCL 块的"a_addr"数组。
您正在尝试将int*
、a
投射到double
。这不能作为指针存储地址 - 整数来完成。
您需要修改代码以:
volatile double **a_addr = (volatile double**) 0x43C00040;
volatile double **c_addr = (volatile double**)0x43C00048;
...
void main(){
...
double* a;
double* c;
a = (double*)malloc(WG_SIZE_X *sizeof(double));
c = (double*)malloc(WG_SIZE_X *sizeof(double));
*a_addr =a;
*c_addr =c;
...
}
或者你想以与原始代码类似的方式来做到这一点:
volatile int *a_addr = (volatile int*) 0x43C00040;
volatile int *c_addr = (volatile int*)0x43C00048;
...
void main(){
...
double* a;
double* c;
a = (double*)malloc(WG_SIZE_X *sizeof(double));
c = (double*)malloc(WG_SIZE_X *sizeof(double));
*a_addr =(int)a;
*c_addr =(int)c;
...
}
相关文章:
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 成员引用基类型 'double [10]' 不是结构或联合
- 类型 "double" 的参数与类型 "double *" 的参数不兼容
- 错误:无法将参数“1”的“double*”转换为“double”,错误:数组下标的类型“double[double]”无
- 错误:无法将 "double*" 类型的值分配给类型 "double" 的实体
- 智能感知:不能将 "void" 类型的值分配给类型 "double" 的实体
- 警告:格式"%5f"需要类型"double",但参数3的类型为"int
- 在C++命名空间中使用内置类型(double、int等)
- 'Int'不可转换为类型 'double'
- 错误 C2296:'%':非法的左操作数在 C++ 中具有类型 'double'
- 成员引用基类型'double'不是结构或联合
- c++mex错误:数组下标的类型“double[mwSize]”无效
- 无法将'a'(类型"int")转换为类型"double&"
- C++从类型“void*”转换为类型“double”无效
- 将const char传递给不兼容的类型double
- 无效的数组下标类型' double[int] '
- 如何从steady_clock返回经过的时间作为原始数据类型(double)