C++ 如何修改CUDA代码以获得100%的GPU负载
如何修改此代码以获得100%的GPU负载C++ 如何修改CUDA代码以获得100%的GPU负载,c++,cuda,gpgpu,gpu,C++,Cuda,Gpgpu,Gpu,如何修改此代码以获得100%的GPU负载 #include <iostream> using namespace std; __global__ void saxpy_parallel(int n, float a, float *x, float *y) { // Get the unique ID of this kernel instance int i = blockIdx.x * blockDim.x + threadIdx.x; if (i &
#include <iostream>
using namespace std;
__global__ void saxpy_parallel(int n, float a, float *x, float *y)
{
// Get the unique ID of this kernel instance
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
{
y[i] = a*x[i] + y[i];
}
}
int main(int argc, char const *argv[])
{
// Tensors length
int const n = 100;
// Define tensors
float x[n], y[n];
for (int i = 0; i < n; ++i)
{
x[i] = 1.0f*i;
y[i] = 1.0f*i;
}
// Device pointers
float *d_x, *d_y;
cudaMalloc(&d_x, n*sizeof(float));
cudaMalloc(&d_y, n*sizeof(float));
if (cudaMemcpy(d_x, &x, n*sizeof(float), cudaMemcpyHostToDevice) != cudaSuccess)
{
printf("Memory Error!\n");
return 0;
}
if (cudaMemcpy(d_y, &y, n*sizeof(float), cudaMemcpyHostToDevice) != cudaSuccess)
{
printf("Memory Error!\n");
return 0;
}
// Run the kernel
saxpy_parallel<<<4096, 512>>>(n, 2.0, d_x, d_y);
// Retrieve results from the device memory
cudaMemcpy(&y, d_y, n*sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(d_y);
cudaFree(d_x);
printf("%s\n",y[0]);
system("PAUSE");
return 0;
}
#包括
使用名称空间std;
__全局无效saxpy并行(整数n,浮点a,浮点*x,浮点*y)
{
//获取此内核实例的唯一ID
int i=blockIdx.x*blockDim.x+threadIdx.x;
if(i
好的,让我们忽略100%GPU负载目标,因为它不现实,不容易测量。因此,假设您希望优化此代码以更快地运行。目标是什么?您的算法非常简单,因此不会给自己带来很多机会。然而,我可以看到以下目标
1) 块大小
saxpy_parallel<<<4096, 512>>>
这需要更少的线程,但每个线程做更多的工作。尝试使用2、4、6或8解除干扰
价值观
5) 将结果存储到其他变量中
为结果传入一个额外的参数。然后重新编码
__global__ void saxpy_parallel(int n, float a, float *x, float *y, float * b)
...
b[i] = a*x[i] + y[i];
这就为不在同一位置读写交换了更多内存
如果不单独尝试每一种方法并在前后测量效果,您将无法确定哪些方法有效。那么一些组合可能会更好
或者更糟
试试看,玩得开心,让我们知道 定义“100%GPU使用率”-你是什么意思?@Talonmes对不起。我的意思是:看一看声音“GPU负载”,恐怕你提到的传感器参数GPU负载与CUDA编程无关。我的意思正是@talonmies在他的评论中的意思。我在《CUDA C编程指南》和《CUDA C最佳实践指南》中都找不到GPU负载的定义。所以我认为你必须向这个社区解释一些事情。如果我们不知道GPU负载参数的定义,如何最大化它?投票结束。我还没说你链接的问题很清楚。GPU使用的定义对您来说似乎并不清楚,因为您还没有提供它。说起来可能令人不快,但这应该会让你认为你正在处理的问题尚未以令人满意的方式正式表述出来。
...
y[i] = a*x[i] + y[i];
y[i+1] = a*x[i+1] + y[i+1];
y[i+2] = a*x[i+2] + y[i+2];
y[i+3] = a*x[i+3] + y[i+3];
__global__ void saxpy_parallel(int n, float a, float *x, float *y, float * b)
...
b[i] = a*x[i] + y[i];