0

我有一个在 ATI 流上制作的程序(不是我的——从 i-net 下载的)(更准确的是——在 brook lang 上——文件是 *.br)。有一个 python 脚本(见下文),它使用 ATI 流 SDK 提供的 brook 编译器将其编译为 *.il 文件。在它的脚本将其压缩到 *.Z 文件之后。C 程序的 Makefile 包含此代码

my_kernel_dp11.o: my_kernel_dp11.Z
ld -s -r -o my_kernel_dp11.o -b binary my_kernel_dp11.Z

然后它链接到主执行文件。来自该 obj 文件的数据由 C 程序读取到某个缓冲区中,然后调用calclCompile函数(据我所知,它是 OpenCL 函数)。它在 AMD HD 6970 系列上运行良好,但在 AMD HD 7970 系列上失败并出现以下错误

在后端检测到不受支持的程序结构

这是一个python脚本

#!/usr/bin/python
import sys
import zlib
import os
def makebrz(dp_bits):
try:
    os.unlink("a_slice_dpX_a_slicer.il")
except OSError:
    pass
dpdefs=""
for i in range(dp_bits-11):
    dpdefs = dpdefs + " -D DP_BIT_%i" % (i+12,)
print "DP_DEFS: ", dpdefs
os.system("/usr/local/atibrook/sdk/bin/brcc -k -pp %s a_slice_dpX.br" % (dpdefs,) )
f = open("a_slice_dpX_a_slicer.il")
if f==None:
    print "Could not read ", sys.argv[1]
    sys.exit(-1)
data = f.read()
f.close()
oname = "../my_kernel_dp%i.Z" % (dp_bits,)
data2 = zlib.compress(data)
fo = open( oname, "wb" )
fo.write(data2)
fo.close()
#os.system("ld -s -r -o ../%s.o -b binary %s" % (oname[:-2],oname))
makebrz(11)
makebrz(12)
makebrz(13)
makebrz(14)

这是一个程序http://dl.dropbox.com/u/46469564/a_slice_dpX.br

问题是:我应该怎么做才能使其程序“受支持”?PS 有一个问题——我根本不知道这项技术(布鲁克、ATI 流、OpenCL)。这就是为什么像“你应该试试这个或那个”这样的建议是没有用的。我需要采取特别行动 - 改变这一点,你就会成功:) 谢谢。

4

1 回答 1

1

AFAIK Radeon HD7970 建立在 GCN 架构上,因此如果您使用 brook 生成 IL 代码,南岛的 JIT 可能不知道如何为您正在使用的硬件生成适当的 ISA,所以如果您想继续使用 brook+ 那么您需要等到 Brook+ 的更新版本在 sourceforge 上发布,它可以生成一个转换为正确 ISA(GCN) 的 IL。

其他选择是使用 AMD APP SDK 2.6 并在 OpenCL 中重写您的代码。

于 2012-03-06T03:57:55.947 回答