【发布时间】:2016-07-06 06:05:34
【问题描述】:
我写完了一个用于热力学计算的 OpenCL 内核,并发现了一个非常奇怪的错误。 我的内核是这样的:
__kernel void energy(... float3 dest, int nlocal, ...){
int i = get_global_id(0);
float3 ev = {0.0f, 0.0f, 0.0f};
for(...){
//some thermo calculations, adding values to evx and evy
ev.x +=...;
ev.y +=...;
}
//Then I want to save the result in dest[i].
//Program exits at next two line
dest[i].x = ev.x;
dest[i].y = ev.y;
我收到“未映射的内存”和段错误错误。尝试使用 printf 打印值时出现相同的错误。似乎程序无法读取该值。写入它虽然有效!(可能是因为一些编译器优化) 现在,如果我使用另一个浮点寄存器值,我会得到同样的错误。但是如果我把最后几行改成这样(不使用 ev.x 或 ev.y)
dest[i].x = i/nlocal*3.1f
dest[i].y = ...;
一切都按预期进行,我没有收到任何错误。
这也有效:
int i = ...
float3 = {0.0f, ...}
dest[i].x = ev.x;
但不知何故,在实际计算之后,它就不可能了。
该程序在 Nvidia K40m、Kepler 架构上运行。
【问题讨论】:
-
问题也可以在这里:
ev.x +=...; ev.y +=...;。 CL 编译器将简单地删除不影响输出数组的代码。发布可重现的代码示例,否则我们无法帮助您。 -
感谢您的帮助,我已经更改了我的代码。它现在是整个内核。