我是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中使用它来创建体系结构:Image 1
将其导出到Vivado SDK并使用并修改here中的代码后。 OpenCL块无法正确执行,我也不知道其原因。
所以我的问题是为什么当我将int类型替换为float或double时会给我一个错误。
旧代码:
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;
...
}
它给我这个错误:
从类型'double *'到类型'double'的无效转换
[请帮助我,我想将“ 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;
...
}