我和一些同伴正在开发一个游戏(Rigs ofRods),并正在尝试集成OpenCL进行物理计算。同时,我们正在尝试对数据结构进行一些非常需要的清理。我想我应该说我们正在尝试清理数据结构并注意OpenCL要求。
使用开放式CL的问题之一是由于内存空间不同而无法使用指针。我对OpenCL所了解的很少,是将所有数据复制到GPU上,然后执行计算,指针值将被复制,但地址将与预期的地址不对应。
有问题的数据集中在数组中,当对象需要该数据时,它们使用指向所需对象的指针或存储数组索引。
解决OpenCL的一种解决方案是使用数组索引而不是指针。这导致硬耦合,可能导致以后出现头痛。作为解决方案,我想到了根据起始地址和当前地址计算数组索引的想法。当然,这仅适用于连续数组。
我编写了一个示例应用程序进行测试,它运行良好,有人在不同的平台上对其进行了验证。
#include <iostream>
typedef struct beam_t
{
unsigned int item;
} beam_t;
#define GLOBAL_STATIC_ASSERT(expr, msg) \
extern char STATIC_ASSERTION__##msg[1]; \
extern char STATIC_ASSERTION__##msg[(expr)?1:2]
#ifdef __amd64
typedef unsigned long pointer_int;
#else
typedef unsigned int pointer_int;
#endif
GLOBAL_STATIC_ASSERT(sizeof(pointer_int) == sizeof(pointer_int*), integer_size);
#define MAX_BEAM 5
int main ()
{
beam_t beams[MAX_BEAM];
beam_t* beam_start = &beams[0];
beam_t* beam_ptr = NULL;
std::cout << "beams: " << &beams << "\n";
for( pointer_int i = 0; i < MAX_BEAM; ++i )
{
beam_ptr = &beams[i];
pointer_int diff = ((pointer_int)beam_ptr - (pointer_int)beam_start);
std::cout << "beams[" << i << "]: " << beam_ptr
<< "\t calculated index:" << diff / sizeof(beam_t)
<< "\n";
}
return 0;
}
我担心这更多的是争执而不是严格的解决方案。我知道这不会在非连续内存中起作用。
基本上我的问题是这样的:
在已知的连续内存中使用这种方法会有什么陷阱?
您怎么能知道它是连续的?
人们在处理此类问题时使用了哪些方法?
谢谢,如果格式化不正确,我也很高兴,这是我第一次发布问题。
最佳答案
这应该给你相对于pointer
的base
索引:
pointer - base
是的,就是这么简单。 =]
使用
ptrdiff_t
可移植地存储结果。