用pthread进行cuda编程 #包括 #包括 #包括 #定义ARR_尺寸10 #定义NUM_设备1 类型定义结构{ int*arr; 国际开发署; int*dev_结果; int*结果; int-num; }库达乌街; __全局无效内核(int*dev\u arr,int*dev\u结果) { int idx=threadIdx.x; printf(“dev_arr[%d]=%d\n”,idx,dev_arr[idx]); 原子添加(dev_result,dev_arr[idx]); } void*thread_func(void*struc) { cuda_st*数据=(cuda_st*)结构; printf(“线程%d函数开始\n”,数据->数值); printf(“arr%d=,data->num); 对于(int i=0;iarr[i]); } printf(“\n”); cudaSetDevice(数据->数值); cudaMemcpy(数据->开发arr,数据->arr,sizeof(int)*arr\u大小,cudaMemcpyHostToDevice); 内核(数据->开发arr,数据->开发结果); cudaMemcpy(数据->结果,数据->开发结果,sizeof(int),cudaMemcpyDeviceToHost); printf(“线程%d函数退出\n”,数据->数值); 返回NULL; } 内部主(空) { //制造对象 cuda_st cuda[数字设备]; //制线 pthread_t pthread[NUM_DEVICE]; //主机阵列内存分配 int*arr[NUM_设备]; 对于(int i=0;i
问题在于在一个设备上分配内存。在调用用pthread进行cuda编程 #包括 #包括 #包括 #定义ARR_尺寸10 #定义NUM_设备1 类型定义结构{ int*arr; 国际开发署; int*dev_结果; int*结果; int-num; }库达乌街; __全局无效内核(int*dev\u arr,int*dev\u结果) { int idx=threadIdx.x; printf(“dev_arr[%d]=%d\n”,idx,dev_arr[idx]); 原子添加(dev_result,dev_arr[idx]); } void*thread_func(void*struc) { cuda_st*数据=(cuda_st*)结构; printf(“线程%d函数开始\n”,数据->数值); printf(“arr%d=,data->num); 对于(int i=0;iarr[i]); } printf(“\n”); cudaSetDevice(数据->数值); cudaMemcpy(数据->开发arr,数据->arr,sizeof(int)*arr\u大小,cudaMemcpyHostToDevice); 内核(数据->开发arr,数据->开发结果); cudaMemcpy(数据->结果,数据->开发结果,sizeof(int),cudaMemcpyDeviceToHost); printf(“线程%d函数退出\n”,数据->数值); 返回NULL; } 内部主(空) { //制造对象 cuda_st cuda[数字设备]; //制线 pthread_t pthread[NUM_DEVICE]; //主机阵列内存分配 int*arr[NUM_设备]; 对于(int i=0;i,cuda,pthreads,Cuda,Pthreads,问题在于在一个设备上分配内存。在调用cudamaloc之前,需要调用cudaSetDevice: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define ARR_SIZE 10 #define NUM_DEVICE 1 typedef struct { int *arr; int *dev_arr; int *dev_result; int *r
cudamaloc
之前,需要调用cudaSetDevice
:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define ARR_SIZE 10
#define NUM_DEVICE 1
typedef struct {
int *arr;
int *dev_arr;
int *dev_result;
int *result;
int num;
} cuda_st;
__global__ void kernel_fc(int *dev_arr, int *dev_result)
{
int idx = threadIdx.x;
printf("dev_arr[%d] = %d\n", idx, dev_arr[idx]);
atomicAdd(dev_result, dev_arr[idx]);
}
void *thread_func(void* struc)
{
cuda_st * data = (cuda_st*)struc;
printf("thread %d func start\n", data->num);
printf("arr %d = ", data->num);
for(int i=0; i<10; i++) {
printf("%d ", data->arr[i]);
}
printf("\n");
cudaSetDevice(data->num);
cudaMemcpy(data->dev_arr, data->arr, sizeof(int)*ARR_SIZE, cudaMemcpyHostToDevice);
kernel_fc<<<1,ARR_SIZE>>>(data->dev_arr, data->dev_result);
cudaMemcpy(data->result, data->dev_result, sizeof(int), cudaMemcpyDeviceToHost);
printf("thread %d func exit\n", data->num);
return NULL;
}
int main(void)
{
// Make object
cuda_st cuda[NUM_DEVICE];
// Make thread
pthread_t pthread[NUM_DEVICE];
// Host array memory allocation
int *arr[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
arr[i] = (int*)malloc(sizeof(int)*ARR_SIZE);
}
// Fill this host array up with specified data
for(int i=0; i<NUM_DEVICE; i++) {
for(int j=0; j<ARR_SIZE; j++) {
arr[i][j] = i*ARR_SIZE+j;
}
}
// To confirm host array data
for(int i=0; i<NUM_DEVICE; i++) {
printf("arr[%d] = ", i);
for(int j=0; j<ARR_SIZE; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
// Result memory allocation
int *result[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
result[i] = (int*)malloc(sizeof(int));
memset(result[i], 0, sizeof(int));
}
// Device array memory allocation
int *dev_arr[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
cudaMalloc(&dev_arr[i], sizeof(int)*ARR_SIZE);
}
// Device result memory allocation
int *dev_result[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
cudaMalloc(&dev_result[i], sizeof(int));
cudaMemset(dev_result[i], 0, sizeof(int));
}
// Connect these pointers with object
for(int i=0; i<NUM_DEVICE; i++) {
cuda[i].arr = arr[i];
cuda[i].dev_arr = dev_arr[i];
cuda[i].result = result[i];
cuda[i].dev_result = dev_result[i];
cuda[i].num = i;
}
// Create and excute pthread
for(int i=0; i<NUM_DEVICE; i++) {
pthread_create(&pthread[i], NULL, thread_func, (void*)&cuda[i]);
}
// Join pthread
for(int i=0; i<NUM_DEVICE; i++) {
pthread_join(pthread[i], NULL);
}
for(int i=0; i<NUM_DEVICE; i++) {
printf("result[%d] = %d\n", i, (*cuda[i].result));
}
return 0;
}
//设备阵列内存分配
int*dev_arr[NUM_DEVICE];
对于(int i=0;i有多少个GPU?只有2个设备,并且两者都是GTX580。如果您只有一个设备,并且您希望使用pthread,如上图所示,则删除cudaSetDevice(数据->num);它应该可以正常工作..Eric/我理解你的意思,但是我如何将你的想法应用到我的源代码中?哦,那么你可以尝试添加错误检查,如果cuda调用cudaSetDevice成功与否?哦,我错过了。谢谢!
// Device array memory allocation
int *dev_arr[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
cudaSetDevice(i);
cudaMalloc(&dev_arr[i], sizeof(int)*ARR_SIZE);
}
// Device result memory allocation
int *dev_result[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
cudaSetDevice(i);
cudaMalloc(&dev_result[i], sizeof(int));
cudaMemset(dev_result[i], 0, sizeof(int));
}