我为两个矩阵的元素乘法构建了一个内核,但至少在我的配置中,当每个矩阵大于2GB时,我的OpenCL内核只会更快.所以我想知道,如果是因为我的天真内核(见下文)或者因为元素操作的本质,这意味着元素操作不会因使用GPU而获益.
感谢您的输入!
核心:
KERNEL_CODE = """
// elementwise multiplication: C = A .* B.
__kernel void matrixMul(
__global float* C,
__global float* A,
__global float* B,
int width, int height)
{
// ID
int x = get_global_id(0);
int y = get_global_id(1);
// Multiplying
C[y * height + x ] = A[y * height + x] * B[y * height + x];
}
"""
Run Code Online (Sandbox Code Playgroud)
ps我读了一些专家认为,CUDA与OpenCL有太大的不同,无法在同一个问题中回答这两个问题,可以自由地从标题和标签中删除它.
我正在尝试开始使用该<amp.h>库.但是当我输入时#include amp.h,我收到一条错误消息,说无法打开源文件<amp.h>.有什么特别的东西我需要做才能使它可用吗?
#include <stdio.h>
#include <tchar.h>
#include <amp.h>
Run Code Online (Sandbox Code Playgroud) (void**)&x和(void*)x之间有什么区别?我会给你一些代码,请帮帮我.
float *xd;
int size=width*width*size(float);
cudaMalloc((void **)&x,size); 1
cudaMalloc((void *)x,size); 2
cudaMalloc(&x,size); 3
cudaMalloc(*x,size); 4
cudaFree(xd);
Run Code Online (Sandbox Code Playgroud)
我只想知道其中的区别.
cudaMalloc()函数的第一个参数是指针变量的地址,该变量必须在分配后指向分配的对象.指针变量的地址应该转换为(void**),因为函数需要一个通用指针值; 内存分配函数是一个通用函数,不限于任何特定类型的对象.此地址允许cudaMalloc()函数将已分配对象的地址写入指针变量.3 cudaMalloc()函数的第二个参数以字节为单位给出要分配的对象的大小.第二个参数的使用与C malloc()函数的size参数一致.
我正在使用GPU内核,我在将数据从全局内存复制到本地内存时遇到一些问题,这是我的内核函数:
__kernel void nQueens( __global int * data, __global int * result, int board_size)
Run Code Online (Sandbox Code Playgroud)
所以我想从__global int*data复制到__local int aux_data [OBJ_SIZE] 我试图像普通数组一样复制:
for(int i = 0; i < OBJ_SIZE; ++i)
{
aux_data[stack_size*OBJ_SIZE + i] = data[index*OBJ_SIZE + i];
}
Run Code Online (Sandbox Code Playgroud)
还有复制功能:
event_t e = async_work_group_copy ( aux_data, (data + (index*OBJ_SIZE)), OBJ_SIZE, 0);
wait_group_events (1, e);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我在全局和本地内存之间得到不同的值.我不知道我做错了什么......
我有一些函数可以在常量设备内存中加载变量并启动内核函数.我注意到第一次将一个变量加载到常量内存中时需要0.6秒,但是常量内存上的下一个加载非常快(0.0008秒).无论哪个函数是main中的第一个函数,都会出现此行为.下面是一个示例代码:
__constant__ double res1;
__global__kernel1(...) {...}
void function1() {
double resHost = 255 / ((double) size);
CUDA_CHECK_RETURN(cudaMemcpyToSymbol(res1, &resHost, sizeof(double)));
//prepare and launch kernel
}
__constant__ double res2;
__global__kernel2(...) {...}
void function2() {
double resHost = 255 / ((double) size);
CUDA_CHECK_RETURN(cudaMemcpyToSymbol(res2, &resHost, sizeof(double)));
//prepare and launch kernel
}
int main(){
function1(); //takes 0.6 seconds for loading
function2(); // takes 0.0008 seconds for loading
function1(); //takes 0.0008 seconds for loading
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我可以避免吗?
有一些方法可以实现GPU共享.我遇到了入住.我是否可以使用它在共享GPU的进程(例如tensorflow)中切片GPU?这里的切片意味着GPU资源始终专用于该过程.使用占用率我将了解GPU和SM的详细信息,并基于此我启动内核,说明为这些GPU资源创建块.
我正在使用安装了cuda 9工具包的NVIDIA公司的GK210GL [特斯拉K80]
请建议.谢谢!
我正在寻找一种用于试验GPU编程的图形卡的建议.我倾向于通过CUDA倾向于OpenCL.还在寻找价格合理的卡(价格是50美元还是更低?)
使用nvprof,我发现以下内核是我的CUDA应用程序的瓶颈
__global__ void extractColumn_kernel(real_t *tgt, real_t *src, int *indices, int numRows, int len) {
int stride = gridDim.x * blockDim.x;
int tid = blockDim.x * blockIdx.x + threadIdx.x;
for (int j = tid; j < len; j += stride) {
int colId = j / numRows;
int rowId = j % numRows;
tgt[j] = src[indices[colId]*numRows + rowId];
}
}
Run Code Online (Sandbox Code Playgroud)
它打算将src列出的矩阵的列提取indices到矩阵中tgt.请注意,矩阵src和tgt两者都有numRows行,并以列主要维度存储.此外,len = length(indices)*numRows是矩阵的条目总数tgt. …
我刚刚在CUDA中学习了流技术,并尝试了它。然而,不希望的结果返回,即,流不是并行的。(在GPU Tesla M6,OS Red Hat Enterprise Linux 8上)
我有一个大小为(5,2048)的数据矩阵,还有一个处理矩阵的内核。
我的计划是分解“ nStreams = 4”扇区中的数据,并使用4个流来并行执行内核。
我的部分代码如下所示:
int rows = 5;
int cols = 2048;
int blockSize = 32;
int gridSize = (rows*cols) / blockSize;
dim3 block(blockSize);
dim3 grid(gridSize);
int nStreams = 4; // preparation for streams
cudaStream_t *streams = (cudaStream_t *)malloc(nStreams * sizeof(cudaStream_t));
for(int ii=0;ii<nStreams;ii++){
checkCudaErrors(cudaStreamCreate(&streams[ii]));
}
int streamSize = rows * cols / nStreams;
dim3 streamGrid = streamSize/blockSize;
for(int jj=0;jj<nStreams;jj++){
int offset = jj * streamSize;
Mykernel<<<streamGrid,block,0,streams[jj]>>>(&d_Data[offset],streamSize);
} // d_Data is …Run Code Online (Sandbox Code Playgroud) 所以我正在尝试研究如何在vb.net中使用我的GPU进行处理.我发现了一个看起来很棒的c#教程(对于c#用户来说看起来很简单).无论如何,我对c#的了解非常糟糕,我无法将事情从c#转移到vb.net.
这是链接:
http://www.codeproject.com/Articles/202792/Using-Cudafy-for-GPGPU-Programming-in-NET
如果有人可以将其转换为vb.net代码(这是有道理的)那么那就太好了.否则,如果有人可以给我一个非常简单的vb.net示例,基于本教程(或其他任何东西)在GPU上运行矢量操作,那么这可能会更好!:d
gpu-programming ×10
cuda ×8
gpgpu ×4
opencl ×3
c ×2
c++ ×2
c# ×1
c++-amp ×1
extraction ×1
matrix ×1
pointers ×1
tensorflow ×1
vb.net ×1
windows ×1