- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写的程序涉及一些矩阵 vector 乘法和最小二乘求解,全部使用 cublas 和 cula API。程序会迭代很多次。在每一步中,我都必须将一个矩阵的特定行全部设置为零。
我试图将整个矩阵(50*1000 或更大)复制到 cpu 并将一行设置为零,然后将矩阵复制回来,但这太耗时了,因为程序将迭代 10 次或更多次。所以我决定写一个内核函数。
像这样的全局函数:
__global__ void Setzero(float* A, int index) /* A is the matrix and in col-major , index is the row I want to set zero */
{
int ind=blockDim.x*blockIdx.x+threadIdx.x;
if( ((ind%N)==index ) && (ind<50000) ) //notice matrix is in col-major ,matrix size is 50000
{
A[ind]=0.0;
ind+=blockDim.x*blockIdx.x;
}
else ;
__syncthreads();
}
问题是我何时执行此操作(在调用函数之前使用 cublas):
cudaMalloc((void**)&A_Gpu_trans,sizeof(float)*50000);
cudaMemcpy(A_Gpu_trans,A_trans,sizeof(float)*M*N,cudaMemcpyHostToDevice);
cublasSgemv_v2(handle,CUBLAS_OP_N,1000,50,&al,A_Gpu_trans,1000,err_gpu,1,&beta,product,1);
dim3 dimBlock(16,1);
dim3 dimGrid((50000-1)/16+1,1);
Setzero<<<dimGrid,dimBlock>>>(A_Gpu_trans,Index);
它返回错误:
a __host__ function("Setzero") redeclared with __global__.
还有一个错误:
MSB3721: command“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2010 -ccbin "D:\Program Files\Microsoft Visual Studio 10.0\VC\bin" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -G --keep-dir Debug -maxrregcount=0 --machine 32 --compile -cudart static -g -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o Debug\kernel.cu.obj "C:\Users\Administrator\documents\visual studio 2010\Projects\OOmp\OOmp\kernel.cu"”return 2。
奇怪的是,当我只使用 cublas 和 cula API 时,我可以得到正确的答案。
最佳答案
此外,您的函数既错误又效率极低...
你不能在这样的条件下调用同步线程,它可能会导致挂起。它在这里似乎也完全没有必要。
更重要的是,您正在为每个矩阵条目启动一个线程,但实际上只有 1/N 的线程执行任何操作。
更好的方法是只启动与将被设置为零的条目对应的线程。像这样:
__global__ void Setzero(float* A, int index)
{
int ind=blockDim.x*blockIdx.x+threadIdx.x;
if (ind < M)
A[index+N*ind]=0.0;
}
然后您启动 M 个线程(或者更确切地说,每个 256 个线程线程的 ceil(M/256) 个线程 block ,或者您想要的任何 block 大小)。
例如:
int block_size = 256; // usually a good choice
int num_blocks = (M + block_size - 1) / block_size;
Setzero<<<num_blocks, block_size>>>(A, index);
关于c++ - 库达和库布拉斯 :call a global function after using cublas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22267724/
我有一个流 randStream,它每半秒发出一次随机值,还有一个 boolStream,它将值从 randStream 转换为 bool 值。 let randStream = Kefir.from
我是一名优秀的程序员,十分优秀!