我有一个MPI项目,我应该用cuda转换它。
问题很简单,项目使用此代码分配不同类型的3d矩阵。
void ***Matrix3Allocate(Point3 offset, Point3 size, int dataSize){
void *matrix_data;
void **matrix_data_ptr;
void ***matrix;
int nb_elements = Matrix3GetNbElements(size);
message("Allocate matrix (%d,%d,%d) %d ko (plus pointeurs : %d ko)",
size.x, size.y, size.z, nb_elements * dataSize / 1024,
size.x * ( 1 + size.y ) * sizeof(void*) / 1024);
matrix = (void ***)secure_malloc(size.x * sizeof(void**));
matrix_data_ptr = (void **)secure_malloc(size.x * size.y * sizeof(void*));
matrix_data = (void *)secure_malloc(nb_elements * dataSize);
matrix -= offset.x;
for(int x = offset.x; x < offset.x + size.x; x++)
matrix[x] = matrix_data_ptr + size.y * (x - offset.x) - offset.y;
for(int x = offset.x; x < offset.x + size.x; x++)
for(int y = offset.y; y < offset.y + size.y; y++)
matrix[x][y] = matrix_data +
((x - offset.x) * size.y * size.z +
(y - offset.y) * size.z - offset.z) * dataSize;
return matrix;
}
编译时我有一个错误C2036:'void *'这个部分的未知大小:
matrix[x][y] = matrix_data + ((x - offset.x) * size.y * size.z +
(y - offset.y) * size.z - offset.z) * dataSize;
我理解为什么编译器会尖叫但是这段代码以前工作(可能使用不同的编译器)并且我想更改最少的代码。
我可以使用简单的标志吗?
是否有一个可以使其编译而没有错误的最小修改?
明显的(大)解决方案是使用c ++模板,但这是一个C项目,所以如果在C中有另一个(更简单的)解决方案...
感谢。
答案 0 :(得分:3)
问题是添加了一个void指针(matrix_data +
...)
至于我解释你的代码,它应该首先将它转换为char *
。
所以试试
matrix [x][y] = ((char *) matrix_data) + ...
答案 1 :(得分:1)
此行给出错误的原因:
matrix[x][y] = matrix_data + ((x - offset.x) * size.y * size.z +
(y - offset.y) * size.z - offset.z) * dataSize;
是指向指针添加值后,编译器需要知道具体类型,以便对下一个元素进行正确的“跨步”。由于一切都是无效*,编译器除了给你错误外别无选择。
如果你的目标是增加sizeof(char)
,那么你需要使用char指针。最简单的解决方法是使用指向char *
的{{1}}:
matrix_data