线程64后数组的内存管理错误
OpenCL C++ - memory management error for array after thread 64
我在使用openCL c++时遇到了这个非常奇怪的问题。问题是,我有100个线程,每个线程访问100个大小的数组中的一个元素。从0到63没有问题,每个线程都在正确地计算和更新数组元素的值。但是当它到达线程64时,它搞砸了,用一些其他值更新值…
我是这样调用内核的:
kernelGA(cl::EnqueueArgs(queue[iter],
cl::NDRange(200 / numberOfDevices)),
d_value,
d_doubleParameters,
buf_half_population, and so on...)
在内核端,我使用:
访问每个线程__kernel void kernelGA (__global double * value,
__global double * doubleParameters,
__global double * population,
__global double * scores, and so on...)
int idx = get_global_id(0); // This gives me 100 threads for each device. (I have two devices)
int size_a = 50;
double tempValue[size_a];
// Copying the global "value" into local array so each thread has its own copy.
for (int i = 0; i < size_a; i++) {
tempValue[i] = value[i];
}
此时,每个线程现在都有自己的tempValue[]数组,具有相同的值。然后我对每个线程的tempValue[]数组的值进行了一些计算和公式…
// Applying some computations on tempValue and changing the values for each copy of tempValue for each thread.
tempValue[i] = some calculations for each thread...
之后,我为每个线程访问tempValue[]数组中的每个元素,并将它们连续地放回一个更大的数组中(线程数* size_a)。记住,数组的索引是这样的:0,1,2,3,…等等…
for (int i = 0; i < size_a; i++) {
totalArray[(idx * size_a) + i] = tempvalue[i];
}
因此,当我在内核外得到totalArray的答案并打印它们时,前64个(从0-63)线程已经正确地将它们的值放在totalArray[]中。但是64之后,索引就乱了。我指的不是确切的索引,因为我只打印了索引,而索引是对所有线程的正确访问。但是值似乎是混乱的…
例如:线程0-63的第3、4、5、6个元素的值分别为50、60、70、80。但是对于线程64以后,第3、4、5和6个元素的值分别是80,90,100,110。就好像这些值向后移动了几个元素。为什么?这是怎么回事?
如果多个设备在同一个数组上工作,
你把
cl::NDRange(200 / numberOfDevices)
范围
但是你没有放
cl::NDRange((200 / numberOfDevices)*deviceIndex)
作为每个设备的偏移量。
所有设备试图写入相同的位置,而不是相邻的组。
你也没有检查总线程数是否小于内核中的数组长度,所以一些线程可能会尝试写越界。
所以我找到了解决问题的方法:
问题是,即使每个线程都有自己的value[]
数组副本存储在tempValue[]
数组中:
// Copying the global "value" into local array so each thread has its own copy.
for (int i = 0; i < size_a; i++) {
tempValue[i] = value[i];
}
在线程64之后,数组中的值被打乱了。所以我所做的就是在主机代码(sizeOf(value) * 100
)中创建一个更大的值数组,然后将数组的第一部分复制到其余99个部分,然后将其发送到设备。然后我让每个线程使用索引访问value[]数组的自己的部分。
问题解决了!
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理