如何在多GPU上实现基数排序 - 与在单GPU上相同,即通过拆分数据然后在单独的GPU上构建直方图,然后使用合并数据(如一堆卡)?
我在Geforce GTX 580(Fermi)上使用CUDA 4.0.我的数字小到7.721155e-43.我想将它们相互增加一次或者更好地说我想计算7.721155e-43*7.721155e-43.
我的经验告诉我,我不能直接做到这一点.你能给我一个建议吗?我需要使用双精度吗?怎么样?
我有点困惑Warps发散并需要通过__syncthreads()函数同步.块中的所有元素都以SIMT方式处理相同的代码.他们怎么可能不同步?它与调度程序有关吗?不同的warp会有不同的计算时间吗?为什么使用时有开销__syncthreads()?
让我们说我们在一个区块中有12个不同的Warps已经完成了他们的工作.所以现在有空转,其他经线得到他们的计算时间.或者他们还有计算时间来完成这项__syncthreads()功能吗?
我想将图像上传到以下变量中gpu::GpuMat test;。首先,将输入图像(src)转换为灰度图像cvtColor( src, src_gray, COLOR_BGR2GRAY );,然后将其上传test.upload(src_gray);。不幸的是,上传花费了很多时间。超过2分钟。图像尺寸为169x90。我知道,由于带宽的原因,通常会有一些延迟,但是我认为两分钟对于这么小的图像来说实在太多了。最后,我要提到的是,在上传第一个图像之后,下一个图像的加载几乎是即时的。有初始化程序吗?我们可以改善这种延迟吗?
int main( int, char** argv )
{
/// Load source image and convert it to gray
string filename = argv[1] ;//"yourfile.avi";
VideoCapture capture(filename);
if( !capture.isOpened() )
throw "Error when reading steam_avi";
int framenumber=1;
Mat src, src_gray;
gpu::GpuMat test;
namedWindow( "w", 1);
time_t start,end;
time (&start);
for( ; ; )
{
//printf("Frame %d: \n", framenumber++ );
capture >> src;
cvtColor( src, src_gray, COLOR_BGR2GRAY );
test.upload(src_gray);//it takes too …Run Code Online (Sandbox Code Playgroud) 我有一个cuda内核,当从单个CPU线程调用时,它可以正常工作。但是,当从多个CPU线程(〜100)调用同一内核时,大多数内核似乎根本不执行,因为结果全为零。有人可以指导我如何解决此问题吗?
在当前版本的内核中,我在内核调用结束时使用cudadevicesynchronize()。在这种情况下,在cudaMalloc()和内核调用之前添加sync命令会有帮助吗?
还有另一件事需要澄清。例如,如果两个CPU线程执行相同的cudaMalloc()命令,则后者会覆盖GPU内存中的前者还是会创建自己的内存?
在此先感谢您的帮助
我在NVidia X Server Settings小程序和我的xorg.conf中看到对BaseMosaic的引用,但我找不到它的好描述.它是什么,它做了什么?
我正试图在AMD Fury X上初始化OpenCL 2.0,而我正在研究它的价值__OPENCL_VERSION__.无论如何都是120.我在寻找我的司机和内外#define __OPENCL_VERSION__ 120并#define __OPENCL_VERSION__ 200可以在那里找到.
是否需要在某处启用特殊标志才能启用2.0版?我有以下平台和设备:
Advanced Micro Devices,Inc.的OpenCL平台"AMD加速并行处理",版本OpenCL 2.0 AMD-APP(1912.5),FULL_PROFILE
设备:Advanced Micro Devices,Inc.'斐济'(驱动程序版本:1912.5(VM))
OpenCL版本: OpenCL 2.0 AMD-APP(1912.5)
OpenCL"C"版本:OpenCL C 2.0
编辑
啊,傻.它似乎有助于-cl-std=CL2.0在编译器选项中指定clCreateProgramWithSource.那应该是预期的行为吗?
许多框架要求您的nvidia显卡具有特定的计算能力版本.
我正在开发一个使用Cuda的C++应用程序.我应该通过代码获取此信息.这样我就可以为每个图形计算能力分配所需的框架.如何在C/C++中了解我的nvidia图形的计算能力?
免责声明:我对CUDA和并行编程都很陌生 - 所以如果你不想回答我的问题,请忽略这一点,或者至少指出我正确的资源,这样我就可以自己找到答案了.
这是我想要使用并行编程解决的特殊问题.我具有存储3D矢量以这种格式一些一维数组- > [v0x, v0y, v0z, ... vnx, vny, vnz]其中n是所述载体,和x,y,z是各自的组分.
假设我想找到[v0, v1, ... vn]一个数组中向量[v0, v1, ... vn]与另一个数组中相应向量之间的叉积.
没有并行化,计算非常简单:
result[x] = vec1[y]*vec2[z] - vec1[z]*vec2[y];
result[y] = vec1[z]*vec2[x] - vec1[x]*vec2[z];
result[z] = vec1[x]*vec2[y] - vec1[y]*vec2[x];
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是了解如何为我目前拥有的数组实现CUDA并行化.由于结果向量中的每个值都是单独的计算,因此我可以有效地并行运行每个向量的上述计算.由于得到的叉积的每个分量都是单独的计算,因此它们也可以并行运行.我将如何设置块和线程/考虑为这样的问题设置线程?