請問一下L大, 我試著將矩陣A(2M*2N)的第一行與第一列加入0值獲得矩陣B,
我直接宣告出一個(2M+1*2N+1)大小的0矩陣, 接著將矩陣A貼到矩陣B上,
以及試著將它參數化(想要做512x512矩陣), 但我寫的kernel function好像沒辦法,
謝謝
矩陣A 矩陣B
1 2 3 4 0 0 0 0 0
5 6 7 8 0 1 2 3 4
9 10 11 12 0 5 6 7 8
13 14 15 16 0 9 10 11 12
0 13 14 15 16
// Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cutil.h>
#include <math.h>
#define NNx 6
#define NNy 6
#define BLOCK_SIZE 16
#define ALIGN 3 // 對齊printf用
__global__ void cu_b1( float *input1, float *input2 )
{
int col = blockIdx.x*blockDim.x+threadIdx.x;
int row = blockIdx.y*blockDim.y+threadIdx.y;
input1[row*(NNx*2+1)+col] = 0;
if( col < NNx*2 && row < NNy*2 )
{
input1[ (NNx*2+1)*(row+1)+col+1 ] = input2[ row*(NNx*2)+col ];
//input1[ (NNx*2+1)*(row+1)+col+1 ] = row*(NNx*2)+col;
//^^^^^^^^^^^^^^^^
// 如果我寫這樣的話他會把row*(NNx*2)+col所有數值貼上去,代表之後input2的位置
但如果加上input2[row*(NNx*2)+col]的話,而無法將input2的值貼上去,
我這樣寫應該沒有錯吧,想不太通..
}
}
// ===================== 主程式 ===================== //
int main(int argc, char* argv[])
{
//____ input ____ //
float *input;
input = (float*) malloc( sizeof(float)*(NNx*2)*(NNy*2) );
for(int i = 0; i < (NNx*2)*(NNy*2); i++)
{
input[i] = i;
}
float *d_input;
cudaMalloc( (void**)&d_input, sizeof(float)*(NNx*2)*(NNy*2) );
cudaMemcpy( d_input, input, sizeof(float)*(NNx*2)*(NNy*2), cudaMemcpyHostToDevice
);
// _________ 補零 _________ //
int bx_b1 = ((NNx*2) + BLOCK_SIZE - 1) / BLOCK_SIZE;
int by_b1 = ((NNy*2) + BLOCK_SIZE - 1) / BLOCK_SIZE;
dim3 blocks_b1(bx_b1,by_b1);
dim3 threads(BLOCK_SIZE,BLOCK_SIZE);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我這邊設定的thread數量與處理矩陣
是一樣的
float *d_b1;
cudaMalloc( (void**)&d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1) );
cu_b1<<<blocks_b1, threads>>>( d_b1, d_input );
float *b1;
b1 = (float*) malloc( sizeof(float)*(NNx*2+1)*(NNy*2+1) );
cudaMemcpy( b1, d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1),
cudaMemcpyDeviceToHost );
// ____ input ____//
printf("input");
for(int i = 0; i < (NNx*2)*(NNy*2); i++)
{
if(i % (NNx*2) == 0) printf("\n");
else printf(" ");
printf("%3.0f", input[i]);
}
printf("\n\n");
// ____ b1 ____//
printf("b1");
for(int i = 0; i < (NNx*2+1)*(NNy*2+1); i++)
{
if(i % (NNx*2+1) == 0) printf("\n");
else printf(" ");
printf("%3.0f", b1[i]);
}
printf("\n");
system("pause");
return 0;
}
請問一下L大, 我試著將矩陣A(2M*2N)的第一行與第一列加入0值獲得矩陣B,
我直接宣告出一個(2M+1*2N+1)大小的0矩陣, 接著將矩陣A貼到矩陣B上,
以及試著將它參數化(想要做512x512矩陣), 但我寫的kernel function好像沒辦法,
謝謝
矩陣A 矩陣B
1 2 3 4 0 0 0 0 0
5 6 7 8 0 1 2 3 4
9 10 11 12 0 5 6 7 8
13 14 15 16 0 9 10 11 12
0 13 14 15 16
// Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cutil.h>
#include <math.h>
#define NNx 6
#define NNy 6
#define BLOCK_SIZE 16
#define ALIGN 3 // 對齊printf用
__global__ void cu_b1( float *input1, float *input2 )
{
int col = blockIdx.x*blockDim.x+threadIdx.x;
int row = blockIdx.y*blockDim.y+threadIdx.y;
input1[row*(NNx*2+1)+col] = 0;
if( col < NNx*2 && row < NNy*2 )
{
input1[ (NNx*2+1)*(row+1)+col+1 ] = input2[ row*(NNx*2)+col ];
//input1[ (NNx*2+1)*(row+1)+col+1 ] = row*(NNx*2)+col;
//^^^^^^^^^^^^^^^^
// 如果我寫這樣的話他會把row*(NNx*2)+col所有數值貼上去(代表input2將會列印
的位置),但如果加上input2[row*(NNx*2)+col]的話,而無法將input2的值貼上去
// 我這樣寫應該沒有錯吧,想不通..
}
}
// ===================== 主程式 ===================== //
int main(int argc, char* argv[])
{
//____ input ____ //
float *input;
input = (float*) malloc( sizeof(float)*(NNx*2)*(NNy*2) );
for(int i = 0; i < (NNx*2)*(NNy*2); i++)
{
input[i] = i;
}
float *d_input;
cudaMalloc( (void**)&d_input, sizeof(float)*NNx*NNy );
cudaMemcpy( d_input, input, sizeof(float)*NNx*NNy, cudaMemcpyHostToDevice
);
// _________ 補零 _________ //
int bx_b1 = ((NNx*2) + BLOCK_SIZE - 1) / BLOCK_SIZE;
int by_b1 = ((NNy*2) + BLOCK_SIZE - 1) / BLOCK_SIZE;
dim3 blocks_b1(bx_b1,by_b1);
float *d_b1;
cudaMalloc( (void**)&d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1) );
cu_b1<<<blocks_b1, threads>>>( d_b1, d_input );
float *b1;
b1 = (float*) malloc( sizeof(float)*(NNx*2+1)*(NNy*2+1) );
cudaMemcpy( b1, d_b1, sizeof(float)*(NNx*2+1)*(NNy*2+1),
cudaMemcpyDeviceToHost );
// ____ input ____//
printf("input");
for(int i = 0; i < (NNx*2)*(NNy*2); i++)
{
if(i % (NNx*2) == 0) printf("\n");
else printf(" ");
printf("%3.0f", input[i]);
}
printf("\n\n");
// ____ b1 ____//
printf("b1");
for(int i = 0; i < (NNx*2+1)*(NNy*2+1); i++)
{
if(i % (NNx*2+1) == 0) printf("\n");
else printf(" ");
printf("%3.0f", b1[i]);
}
printf("\n");
system("pause");
return 0;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.122.192.147
※ 編輯: aada 來自: 140.122.192.147 (03/01 20:07)
※ 編輯: aada 來自: 140.122.192.147 (03/01 20:16)