ATI流在AMD 7970系列上失败



我有一个在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

问题是:我应该怎么做才能使它成为"受支持的"程序?附言:有一个问题——我根本不知道这项技术(brook、ATI streams、OpenCL)。这就是为什么像"你应该试试这个或那个"这样的建议是无用的。我需要特别的行动——改变这一点,你就会成功:)非常感谢。

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

另一种选择是使用AMD APP SDK 2.6并在OpenCL中重写代码。

最新更新