gpt4 book ai didi

c++ - 在 C++ AMP 中控制索引变量

转载 作者:行者123 更新时间:2023-11-28 03:42:04 25 4
gpt4 key购买 nike

我刚刚开始尝试 C++ AMP,我决定用我目前正在进行的项目试一试。在某些时候,我必须为我拥有的 vector 构建一个距离矩阵,为此我编写了下面的代码

unsigned int samplesize=samplelist.size();
unsigned int vs = samplelist.front().size();

vector<double> samplevec(samplesize*vs);
vector<double> distancevec(samplesize*samplesize,0);

it1=samplelist.begin();

for(int i=0 ; i<samplesize; ++i){
for(int j = 0 ; j<vs ; ++j){
samplevec[j + i*vs] = (*it1)[j];
}
++it1;
}

array_view<const double,2> samplearray(samplesize,vs,samplevec);
array_view<writeonly<double>,2> distances(samplesize,samplesize,distancevec);

parallel_for_each(distances.grid, [=](index<2> idx) restrict(direct3d){
double sqrsum=0;
double tempd=0;

for ( unsigned int i=0 ; i<vs ; ++i)
{
tempd = samplearray(idx.x,i) - samplearray(idx.y,i);
sqrsum += tempd*tempd;
}
distances[idx]=sqrsum;
}

但是,如您所见,这并没有考虑距离矩阵的对称性。当我计算矩阵 ij 的平方和时,当 i 和 < em>j 是相反的。有什么办法可以做到这一点?我想出了以下技巧,但我不知道这是否会显着提高性能

    for ( unsigned int i=0 ; i<vs ; ++i)
{
if(idx.x<=idx.y){
break;
}

tempd = samplearray(idx.x,i) - samplearray(idx.y,i);
sqrsum += tempd*tempd;
}

if 条件可以完成这项工作吗?还是您认为 if 语句会不必要地损害性能?我想不出任何替代方案


顺便说一句,我刚刚注意到上面写的代码在我的机器上不起作用,我的机器 gpu 只支持单精度。有什么办法可以解决这个问题吗?报错信息如下:“runtime_exception:并发;parallel_for_each 使用了所选加速器不支持的功能。ID3D11Device::CreateComputeShader:着色器使用当前设备不支持的 double 浮点操作。”

最佳答案

我认为您可以消除 if-condition,如果您只安排所需数量的线程,而不是安排覆盖输出矩阵的整个矩形。您需要的是没有对角线的上三角形或下三角形,您可以使用等差数列计算。

另一种方法是组织输入数据,使其位于两个一维 vector 中,每个线程将从 vector 1 读取值,然后从 vector 2 读取值并计算距离并将其存储在输入 vector 之一中。

终于出现了double precision的错误,因为你使用的网卡不支持double precision运算。请检查您的卡规范以确认这一点。您可以通过切换到单精度类型来解决它,即 array_view 模板中的“float”。

关于c++ - 在 C++ AMP 中控制索引变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com